Función at de <array> en C++
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 es
size() - 1。
- Tipo:
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 <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:
numbers.at(0)Devuelve el primer elemento10(el índice comienza en 0).numbers.at(4)Devuelve el último elemento50(porquesize()es 5, el índice válido es 0-4).- Usando un bucle y
atse 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 <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 a
at(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 <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 que
at()devuelve una referencia lvalue modificable.
Otras extensiones