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