Доступ к элементу С++ 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()
.