Доступ к элементу С++ const

Я попытался использовать оператор [] для доступа к элементу на карте const С++, но этот метод завершился неудачно. Я также попытался использовать "at()" , чтобы сделать то же самое. Он работал на этот раз. Тем не менее, я не мог найти ссылки на использование "at()" для доступа к элементу в карте const С++. Является ли функция "at()" недавно добавленной функцией на карте С++? Где я могу найти дополнительную информацию об этом? Большое вам спасибо!

Примером может быть следующее:

#include <iostream>
#include <map>

using namespace std;

int main()
{
        map<int, char> A;
        A[1] = 'b';
        A[3] = 'c';

        const map<int, char> B = A;

        cout << B.at(3) << endl; // it works
        cout << B[3] << endl;  // it does not work

}

Для использования "B [3]", во время компиляции были возвращены следующие ошибки:

t01.cpp: 14: ошибка: передача 'const станд:: карта, std:: allocator → как 'этот аргумент' _Tp & std:: map < _Key, _Tp, _Compare, _Alloc > :: operator [] (const _Key &) [с _Key = int, _Tp = char, _Compare = std:: less, _Alloc = std:: allocator > ] отбрасывает квалификаторы

Используется компилятор g++ 4.2.1

Ответ 1

at() - это новый метод для std::map в С++ 11.

Вместо того, чтобы вставлять новый построенный по умолчанию элемент как operator[], если элемент с данным ключом не существует, он выдает исключение std::out_of_range. (Это похоже на поведение at() для deque и vector.)

Из-за этого поведения имеет смысл перегрузка const at(), в отличие от operator[], которая всегда имеет потенциал для изменения карты.

Ответ 2

Если элемент не существует в map, добавляет его operator [] - который, очевидно, не может работать в const map, поэтому С++ не определяет версию оператора const. Это хороший пример проверки типов компиляторов, предотвращающий потенциальную ошибку времени выполнения.

В вашем случае вам нужно использовать find, который будет возвращать только элемент (iterator to the), если он существует, он никогда не изменит значение map. Если элемент не существует, он возвращает итератор на карты end().

at не существует и не должен компилироваться. Возможно, это "расширение компилятора" (= ошибка new в С++ 0x).

Ответ 3

[] -оператор создаст новую запись на карте, если данный ключ не существует. Это может изменить карту.

Смотрите ссылку .

Ответ 4

Для меня это становится для меня неожиданностью, но на карте STL нет оператора индексирования const. То есть, B[3] не может быть только для чтения. Из руководства:

Поскольку оператор [] может вставлять новый элемент в карту, он не может быть константной функцией.

Я понятия не имею о at().