Я попытался использовать оператор [] для доступа к элементу на карте const C ++, но этот метод не удался. Я также пытался использовать "at ()", чтобы сделать то же самое. На этот раз это сработало. Однако я не смог найти никаких ссылок на использование "at ()" для доступа к элементу в константной карте C ++. Является ли "at ()" новой функцией в карте C ++? Где я могу найти дополнительную информацию об этом? Большое спасибо!
Примером может быть следующее:
#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 :: map, std :: allocator>>' в качестве аргумента 'this' в '_Tp & std :: map <_Key, _Tp, _Compare, _Alloc> :: operator [] ( const _Key &) [with _Key = int, _Tp = char, _Compare = std :: less, _Alloc = std :: allocator>] 'отбрасывает квалификаторы
Используемый компилятор - g ++ 4.2.1
at()
в VS2013 в проекте, предназначенном для использования инструментария VS2010. Я думал, это означает, что я не использую C ++ 11 ... Но все же он компилируется ... ??Если элемент не существует в a
map
,operator []
он добавит его, что, очевидно, не может работать наconst
карте, поэтому C ++ не определяетconst
версию оператора. Это хороший пример проверки типов компилятора, предотвращающей потенциальную ошибку времени выполнения.В вашем случае вам нужно использовать
find
вместо этого, который будет возвращать только элемент (итератор для), если он существует, он никогда не будет изменятьmap
. Если элемент не существует, он возвращает итератор на картуend()
.at
не существует и даже не должен компилироваться. Возможно, это «расширение компилятора» (=Жукновое в C ++ 0x).источник
[] -Оператор создаст новую запись на карте, если данный ключ не существует. Таким образом, это может изменить карту.
См. Эту ссылку .
источник
Для меня это стало большим сюрпризом, но карта STL не имеет
const
оператора индекса. То естьB[3]
не может быть только для чтения. Из руководства:Поскольку operator [] может вставлять новый элемент в карту, он не может быть константной функцией-членом.
Понятия не имею
at()
.источник