Доступ к элементу Доступ к значениям массива через оператор индекса осуществляется как обычно:
std::cout << myarray[1];
myarray[2] = 7;
Так же, как и в стандартных фиксированных массивах, оператор индекса не выполняет никаких проверок на диапазон. Если указан недопустимый индекс, то произойдут плохие вещи.
std::array поддерживает вторую форму доступа к элементам массива — функция at(), которая осуществляет проверку диапазона:
1. at(pos) Возвращает ссылку на элемент в позиции pos с проверкой границ. Если pos элемент не находится в пределах диапазона контейнера, генерируется исключение типа out_of_range.
Сложность постоянна O(1).
std::array myarray { 8, 6, 4, 1 };
myarray.at(1) = 7; // элемент массива под номером 1 - корректный, присваиваем ему значение 7
myarray.at(8) = 15; // элемент массива под номером 8 - некорректный, получим ошибку
В примере, приведенном выше, вызов myarray.at(1) проверяет, есть ли элемент массива под номером 1, и, поскольку он есть, возвращается ссылка на этот элемент. Затем мы присваиваем ему значение 7. Однако, вызов myarray.at(8) не срабатывает, так как элемента под номером 8 в массиве нет. Вместо возвращения ссылки, функция at() выдает ошибку, которая завершает работу программы (на самом деле выбрасывается исключение типа std::out_of_range. Об исключениях мы поговорим на соответствующих лекциях). Поскольку проверка диапазона выполняется, то функция at() работает медленнее (но безопаснее), чем оператор [].
Пример:
#include
int main()
{
std::array arr;
// write values
arr.at(0) = 2;
arr.at(1) = 4;
arr.at(2) = 6;
// read values
int a = arr.at(0); // a is now 2
int b = arr.at(1); // b is now 4
int c = arr.at(2); // c is now 6
return 0;
}
2) operator[pos] Возвращает ссылку на элемент в позиции pos без проверки границ. Если pos элемент не находится в пределах диапазона контейнера, может возникнуть ошибка, связанная с нарушением сегментации во время выполнения. Этот метод обеспечивает доступ к элементам, эквивалентный классическим массивам, и, следовательно, более эффективный, чем at(pos).
Сложность постоянна O(1).
#include
int main()
{
std::array arr;
// write values
arr[0] = 2;
arr[1] = 4;
arr[2] = 6;
// read values
int a = arr[0]; // a is now 2
int b = arr[1]; // b is now 4
int c = arr[2]; // c is now 6