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

Я пытался передать константу с вектором, это работает: Исключая:

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"];
}

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

10
задан P Shved 2 May 2010 в 05:42
поделиться

3 ответа

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

void pas(const map <string, float> &mm)
{
    cout<<mm.find("a")->second;
    cout<<mm.find("b")->second;
}
2
ответ дан 3 December 2019 в 14:43
поделиться

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

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

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

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

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

25
ответ дан 3 December 2019 в 14:43
поделиться

std :: map :: operator [] вставляет созданный по умолчанию элемент, если запрошенный элемент отсутствует на карте. Это , почему это не константная функция-член . Вместо этого вы можете использовать std :: map :: find , но обязательно проверьте итератор, который он возвращает.

5
ответ дан 3 December 2019 в 14:43
поделиться
Другие вопросы по тегам:

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