Почему я не могу передать структуру const map функции в С++?

Я попытался передать const с вектором, который он работает: Пример:

void damn(const vector <bool> &bb)
{
    for (int i=0; i<bb.size(); i++)
        cout<<bb[i]<<endl;

}

Но при попытке с картой нет:

void pas(const map <string, float> &mm)
{
    cout<<mm["a"];
    cout<<mm["b"];
}

Интересно, почему это не так.

Ответ 1

Я считаю, что это потому, что [] на карте не const, так как он создает новую пару со значением по умолчанию, если вы обращаетесь к несуществующей. Попробуйте

void pas(const map <string, float> &mm)
{
    cout<<mm.find("a")->second;
    cout<<mm.find("b")->second;
}

Ответ 2

map::operator[] немного странно. Он делает это:

  • Ищите ключ.
  • Если найдено, верните его.
  • Если нет, вставьте его и по умолчанию создайте его связанное значение.
  • Затем верните ссылку на новое значение.

Шаг 3 несовместим с const ness. Вместо того, чтобы иметь две разные функциональные перегрузки operator[], язык заставляет вас использовать объекты map::find для const.

В качестве альтернативы можно утверждать, что бы сделать map::operator[] const, если аргумент отсутствует на карте? Выбросить исключение? Undefined поведение? (В конце концов, то, что vector::operator[] делает с индексом за пределами границ.) В любом случае проблему избегают с небольшим неудобством для нас.

my_map.find(key) возвращает my_map.end(), если key не найден.