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