Я пытался передать константу с вектором, это работает: Исключая:
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"];
}
Интересно, почему это не делает.
Я считаю, что это потому, что []
в карте не const
, поскольку он создает новую пару со значением по умолчанию, если вы обращаетесь к несуществующему. Попробуйте
void pas(const map <string, float> &mm)
{
cout<<mm.find("a")->second;
cout<<mm.find("b")->second;
}
map :: operator []
немного странно. Он делает это:
Шаг 3 несовместим с const
ness. Вместо того, чтобы иметь две по-разному функционирующие перегрузки operator []
, язык заставляет вас использовать map :: find
для объектов const
.
С другой стороны, можно было бы возразить, что будет делать map :: operator [] const
, если аргумент отсутствует в карте? Выкинуть исключение? Неопределенное поведение? (В конце концов, это то, что делает vector :: operator []
с индексом, выходящим за границы.) В любом случае проблема устраняется с небольшим неудобством для нас.
my_map.find (key)
возвращает my_map.end ()
, если ключ
не найден.
std :: map :: operator []
вставляет созданный по умолчанию элемент, если запрошенный элемент отсутствует на карте. Это , почему это не константная функция-член . Вместо этого вы можете использовать std :: map :: find
, но обязательно проверьте итератор, который он возвращает.