C ++ const map элемент доступа - PullRequest
       59

C ++ const map элемент доступа

81 голосов
/ 27 февраля 2011

Я пытался использовать оператор [] для доступа к элементу в const C ++ map, но этот метод не удался.Я также пытался использовать "at ()", чтобы сделать то же самое.Это сработало на этот раз.Однако я не смог найти никаких ссылок на использование «at ()» для доступа к элементу в const C ++ map.Является ли at () новой функцией в C ++ map?Где я могу найти больше информации об этом?Большое спасибо!

Примером может быть следующий:

#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> ::[] (const _Key &) [with _Key = int, _Tp = char, _Compare = std :: less, _Alloc = std :: allocator>] 'отбрасывает квалификаторы

Используется компилятор g ++ 4.2.1

Ответы [ 4 ]

106 голосов
/ 27 февраля 2011

at() - это новый метод для std::map в C ++ 11.

Вместо вставки нового созданного по умолчанию элемента, как operator[], если элемент сданный ключ не существует, он выдает исключение std::out_of_range.(Это похоже на поведение at() для deque и vector.)

Из-за этого поведения имеет смысл иметь const перегрузку at(), в отличие от operator[], который всегда может изменить карту.

32 голосов
/ 27 февраля 2011

Если элемент не существует в map, operator [] добавит его - что, очевидно, не может работать на карте const, поэтому C ++ не определяет версию constоператора.Это хороший пример проверки типов компилятором, предотвращающей потенциальную ошибку времени выполнения.

В вашем случае вам нужно использовать find вместо этого, что только вернетэлемент (итератор в), если он существует, он никогда не изменит map.Если элемент не существует, он возвращает итератор для end().

at, который не существует и даже не должен компилироваться.Возможно, это «расширение компилятора» (= ошибка новое в C ++ 0x).

3 голосов
/ 27 февраля 2011

Оператор [] создаст новую запись на карте, если данный ключ не существует.Таким образом, он может изменить карту.

См. ссылку .

2 голосов
/ 27 февраля 2011

Это удивляет меня, но на карте STL нет оператора индекса const.То есть B[3] не может быть только для чтения.Из руководства:

Поскольку оператор [] может вставить новый элемент в карту, он не может быть функцией-константой.

Понятия не имеюо at().

...