Самое большое соображение при решении, какой использовать должен рассмотреть то, что установила Платформа.NET целевая аудитория. Я нахожу, что у большего количества людей есть более низкие версии Платформы.NET, которые только поддерживают Windows Forms, но это - просто мой личный опыт.
Для std :: map
и std :: unordered_map
, оператор []
вставит значение индекса в контейнер если его раньше не было. Это немного неинтуитивно, но так оно и есть.
Поскольку необходимо разрешить сбой и вставить значение по умолчанию, оператор не может использоваться в экземпляре контейнера const
.
Примечание для новых читателей.
Первоначальный вопрос касался контейнеров 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
}
}
Оператор индекса должен быть константным только для контейнера только для чтения (который на самом деле не существует в STL как таковой).
Операторы индекса используются не только для просмотра значений.
Поскольку operator [] может вставлять новый элемент в контейнер, он не может быть константной функцией-членом. Обратите внимание, что определение operator [] чрезвычайно простое: m [k] эквивалентно (* ((m.insert (value_type (k, data_type ())). First)). Second. Строго говоря, в этой функции-члене нет необходимости: она существует только для удобства
Если вы объявляете переменную члена std :: map изменяемой
mutable std::map<...> m_map;
, вы можете использовать non -const функции-члены std :: map в ваших константных функциях-членах.