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

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().