Почему не [] константа оператора для карт STL?

Самое большое соображение при решении, какой использовать должен рассмотреть то, что установила Платформа.NET целевая аудитория. Я нахожу, что у большего количества людей есть более низкие версии Платформы.NET, которые только поддерживают Windows Forms, но это - просто мой личный опыт.

81
задан Luc Hermitte 25 September 2009 в 12:42
поделиться

5 ответов

Для std :: map и std :: unordered_map , оператор [] вставит значение индекса в контейнер если его раньше не было. Это немного неинтуитивно, но так оно и есть.

Поскольку необходимо разрешить сбой и вставить значение по умолчанию, оператор не может использоваться в экземпляре контейнера const .

http://en.cppreference.com/w/cpp/container/map/operator_at

82
ответ дан 24 November 2019 в 09:37
поделиться

Примечание для новых читателей.
Первоначальный вопрос касался контейнеров STL (а не конкретно std :: map)

Следует отметить, что в большинстве контейнеров есть константная версия оператора [].
Просто std :: map и std :: set не имеют версии const, и это результат базовой структуры, которая их реализует.

From std :: vector

reference       operator[](size_type n) 
const_reference operator[](size_type n) const 

Также для вашего второго примера вам следует проверьте, не удается ли найти элемент.

void MyClass::MyFunction( int x ) const
{
    MyMap iter = m_map.find(x);
    if (iter != m_map.end())
    {
        std::cout << iter->second << std::endl
    }
}
27
ответ дан 24 November 2019 в 09:37
поделиться

Оператор индекса должен быть константным только для контейнера только для чтения (который на самом деле не существует в STL как таковой).

Операторы индекса используются не только для просмотра значений.

0
ответ дан 24 November 2019 в 09:37
поделиться

Поскольку operator [] может вставлять новый элемент в контейнер, он не может быть константной функцией-членом. Обратите внимание, что определение operator [] чрезвычайно простое: m [k] эквивалентно (* ((m.insert (value_type (k, data_type ())). First)). Second. Строго говоря, в этой функции-члене нет необходимости: она существует только для удобства

3
ответ дан 24 November 2019 в 09:37
поделиться

Если вы объявляете переменную члена std :: map изменяемой

mutable std::map<...> m_map;

, вы можете использовать non -const функции-члены std :: map в ваших константных функциях-членах.

-1
ответ дан 24 November 2019 в 09:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: