Функция at C++ <array>

Класс контейнера C++ <array>


Среди всех способов доступа к элементам массива,atявляется самым безопасным, потому что обеспечиваетпроверку границ。

atявляется функцией-членом классов контейнеров и используется для того, чтобывозвращать элемент в указанной позициипри выполнении проверки границ. Если индекс выходит за границы, она выбрасываетstd::out_of_rangeисключение.

atреализует безопасный доступ к элементам, позволяя перехватывать и обрабатывать ошибки выхода за границы во время выполнения.

Определения слов: atозначает «в позиции», то есть получает элемент по указанной позиции.


Базовый синтаксис и параметры

atявляется функцией-членом классов-контейнеров, поэтому сначала нужно иметь объект контейнера, а затем использовать оператор точки.чтобы вызвать её.

Формат синтаксиса

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

Описание параметра

  • Параметр: pos
    • Тип:size_type(беззнаковый целочисленный тип, обычноsize_t)
    • Описание: Позиция (индекс) элемента, к которому нужно получить доступ. Индекс начинается с 0, а максимальный допустимый индекс —size() - 1。

Описание функции

  • Возвращаемое значение: возвращает элемент в указанной позицииСсылка. Если контейнер является const-контейнером, возвращается const-ссылка.
  • Действие: Возвращает элемент в указанной позиции. Если индекс выходит за пределы допустимого диапазона (pos >= size()), он выбросит исключениеstd::out_of_rangeисключение.
  • отличие от operator[]: atвыполняет проверку границ,operator[]не выполняет проверку границ (поведение при выходе за границы не определено).

Пример

Давайте досконально освоим его на серии примеров от простого к сложному.atИспользование.

Пример 1: Базовое использование - доступ к элементам

Пример

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

int main() {
    // 1. Создать массив и инициализировать его
    std::array<int, 5> numbers = {10, 20, 30, 40, 50};

    std::cout << "Размер массива: " << numbers.size() << std::endl;

    ⟦⟧// 2. Использование для доступа к элементам
    std::cout << Первый элемент (at(0)): << numbers.at(0) << std::endl;
    std::cout << Второй элемент (at(1)): << numbers.at(1) << std::endl;
    std::cout << Третий элемент (at(2)): << numbers.at(2) << std::endl;
    std::cout << Последний элемент (at(4)): << numbers.at(4) << std::endl;

    // 3. Использование цикла для доступа ко всем элементам
    std::cout << "Все элементы: ";
    for(size_t i = 0; i < numbers.size(); ++i) {
        std::cout << numbers.at(i) << " ";
    }
    std::cout << std::endl;

    return 0;
}

Ожидаемый вывод:

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

Анализ кода:

  1. numbers.at(0)Возвращает первый элемент10(индексы начинаются с 0).
  2. numbers.at(4)возвращает последний элемент50(потому чтоsize()равно 5, допустимые индексы — 0-4).
  3. используя циклы иatможно безопасно обойти все элементы.

Пример 2: перехват исключений выхода за границы

atОсновное преимущество в том, что он может выбрасывать исключения, позволяя нам обрабатывать ошибки выхода за границы.

Пример

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

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

    // Попытка доступа к позиции за границами
    try {
        std::cout << Попытка доступа к at(10)... << std::endl;
        int value = numbers.at(10); // Это вызовет исключение
        std::cout << Значение: << value << std::endl;
    }
    catch(const std::out_of_range& e) {
        std::cout << Перехвачено исключение: << e.what() << std::endl;
    }

    // Обычный доступ
    try {
        std::cout << Доступ к элементу at(2): << numbers.at(2) << std::endl;
    }
    catch(const std::out_of_range& e) {
        std::cout << Перехвачено исключение: << e.what() << std::endl;
    }

    return 0;
}

Ожидаемый вывод:

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

Анализ кода:

  • При доступеat(10)когда, потому что индекс выходит за пределы диапазона, выбрасывается исключениеstd::out_of_rangeисключение.
  • catch(const std::out_of_range& e)Перехватить исключение,e.what()возвращает описание исключения.
  • обычный доступ по индексу не выбрасывает исключений.

Пример 3: Изменение значения элемента

atОн возвращает ссылку, поэтому его можно использовать для изменения значения элемента.

Пример

#include <iostream>
#include <array>

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

    std::cout << "До изменения: ";
    for(size_t i = 0; i < numbers.size(); ++i) {
        std::cout << numbers.at(i) << " ";
    }
    std::cout << std::endl;

    // Используйте at() для получения ссылки и изменения элемента
    numbers.at(0) = 100;
    numbers.at(1) = 200;
    numbers.at(2) = 300;

    std::cout << "After modification: ";
    for(size_t i = 0; i < numbers.size(); ++i) {
        std::cout << numbers.at(i) << " ";
    }
    std::cout << std::endl;

    return 0;
}

Ожидаемый вывод:

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

Анализ кода:

  • numbers.at(0) = 100;Через ссылку было изменено значение первого элемента.
  • Это демонстрируетat()возвращает изменяемую lvalue-ссылку.

Класс контейнера C++ <array>

Другие расширения