Función at de <array> en C++

C++ 容器类 <array>Clase contenedora <array> en C++


Entre todas las formas de acceder a los elementos del array,ates la más segura, ya que proporcionaverificación de límites。

ates una función miembro de la clase contenedora, utilizada paradevolver el elemento en la posición especificada, y realiza verificación de límites. Si el índice está fuera de rango, se lanza unastd::out_of_rangeexcepción.

atImplementa un acceso seguro a los elementos, permitiéndote capturar y manejar errores fuera de rango en tiempo de ejecución.

Definición de la palabra: atSignifica "en la posición de...", es decir, obtener el elemento en la posición especificada.


Sintaxis básica y parámetros

ates una función miembro de la clase contenedora, por lo que necesitas primero tener un objeto contenedor y luego, mediante el operador de punto,.llamarla.

Formato de sintaxis

reference at(size_type pos);
const_reference at(size_type pos) const;

Descripción de parámetros

  • Parámetro: pos
    • Tipo:size_type(tipo entero sin signo, normalmentesize_t)
    • Descripción: la posición (índice) del elemento a acceder. El índice comienza en 0, y el máximo índice válido essize() - 1。

Descripción de la función

  • Valor de retorno: devuelve lareferencia. Si el contenedor es constante, devuelve una referencia constante.
  • Efecto: devuelve el elemento en la posición especificada. Si el índice está fuera del rango válido (pos >= size()), se lanza unastd::out_of_rangeexcepción.
  • Diferencia con operator[]: atrealiza verificación de límites,operator[]no realiza verificación de límites (el comportamiento fuera de rango no está definido).

Ejemplo

Dominemos completamente, a través de una serie de ejemplos de simples a complejos,atsu uso.

Ejemplo 1: Uso básico - Acceso a elementos

Ejemplo

#include <iostream>
#include <array>
#include <stdexcept>

int main() {
    // 1. Crear un array e inicializarlo
    std::array<int, 5> numbers = {10, 20, 30, 40, 50};

    std::cout << "El tamaño del array es: " << numbers.size() << std::endl;

    // 2. Usar at para acceder a los elementos
    std::cout << "Primer elemento (at(0)): " << numbers.at(0) << std::endl;
    std::cout << "Segundo elemento (at(1)): " << numbers.at(1) << std::endl;
    std::cout << "Tercer elemento (at(2)): " << numbers.at(2) << std::endl;
    std::cout << "Último elemento (at(4)): " << numbers.at(4) << std::endl;

    // 3. Usar un bucle para acceder a todos los elementos
    std::cout << "Todos los elementos: ";
    for(size_t i = 0; i < numbers.size(); ++i) {
        std::cout << numbers.at(i) << " ";
    }
    std::cout << std::endl;

    return 0;
}

Resultado esperado:

array的大小是: 5
第一个元素 (at(0)): 10
第二个元素 (at(1)): 20
第三个元素 (at(2)): 30
最后一个元素 (at(4)): 50
所有元素: 10 20 30 40 50

Análisis del código:

  1. numbers.at(0)Devuelve el primer elemento10(el índice comienza en 0).
  2. numbers.at(4)Devuelve el último elemento50(porquesize()es 5, el índice válido es 0-4).
  3. Usando un bucle yatse pueden recorrer todos los elementos de forma segura.

Ejemplo 2: Captura de excepción fuera de rango

atSu principal ventaja es que puede lanzar excepciones, lo que nos permite manejar errores fuera de rango.

Ejemplo

#include <iostream>
#include <array>
#include <stdexcept>

int main() {
    std::array<int, 3> numbers = {10, 20, 30};

    // Intentar acceder a una posición fuera de rango
    try {
        std::cout << "Intentando acceder a at(10)..." << std::endl;
        int value = numbers.at(10); // Esto lanzará una excepción
        std::cout << "Valor: " << value << std::endl;
    }
    catch(const std::out_of_range& e) {
        std::cout << "Excepción capturada: " << e.what() << std::endl;
    }

    // Acceso normal
    try {
        std::cout << "Acceso a at(2): " << numbers.at(2) << std::endl;
    }
    catch(const std::out_of_range& e) {
        std::cout << "Excepción capturada: " << e.what() << std::endl;
    }

    return 0;
}

Resultado esperado:

尝试访问 at(10)...
捕获到异常: array::at: __pos (which is 10) >= _Nm (which is 3)
访问 at(2): 30

Análisis del código:

  • Al acceder aat(10)un índice fuera de rango, se lanza unastd::out_of_rangeexcepción.
  • catch(const std::out_of_range& e)Se captura la excepción,e.what()y se devuelve el mensaje descriptivo de la excepción.
  • El acceso normal a un índice no lanza excepciones.

Ejemplo 3: Modificar el valor de un elemento

atDevuelve una referencia, por lo que se puede usar para modificar el valor del elemento.

Ejemplo

#include <iostream>
#include <array>

int main() {
    std::array<int, 3> numbers = {10, 20, 30};

    std::cout << "Antes de la modificación: ";
    for(size_t i = 0; i < numbers.size(); ++i) {
        std::cout << numbers.at(i) << " ";
    }
    std::cout << std::endl;

    // Usar at() para obtener una referencia y modificar el elemento
    numbers.at(0) = 100;
    numbers.at(1) = 200;
    numbers.at(2) = 300;

    std::cout << "Después de la modificación: ";
    for(size_t i = 0; i < numbers.size(); ++i) {
        std::cout << numbers.at(i) << " ";
    }
    std::cout << std::endl;

    return 0;
}

Resultado esperado:

修改前: 10 20 30
修改后: 100 200 300

Análisis del código:

  • numbers.at(0) = 100;Se modificó el valor del primer elemento mediante la referencia.
  • Esto demuestra queat()devuelve una referencia lvalue modificable.

C++ 容器类 <array>Clase contenedora <array> en C++

Otras extensiones