map<string, string> dada;
dada["dummy"] = "papy";
cout << dada["pootoo"];
Я озадачен, потому что я не знаю, рассмотрело ли это неопределенное поведение или нет, как знать, когда я запрашиваю ключ, который не существует, сделайте я просто использую, находят вместо этого?
Если оператор [] не находит значение для обеспеченного ключа, он вставляет один в том положении.
, Но необходимо отметить , что, если Вы посещаете not exist key
и вызываете, это - функция членства, как mapKV[not_exist_key].member_fun ().The программа может отказать.
Позволяют мне дать пример, протестировать класс как указано ниже:
struct MapValue{
int val;
MapValue(int i=0){
cout<<"ctor: "<<i<<endl; val = i;
}
~MapValue(){
cout<<"dtor: "<<val<<endl;
}
friend ostream& operator<<(std::ostream& out, const MapValue& mv){
cout<<"MapValue: "<<mv.val<<endl;
}
string toString(){
cout<<"MapValue: "<<val<<endl;
}
};
Тестовый код:
cout<<"-------create map<int, MapValue>-------"<<endl;
map<int, MapValue> idName{{1, MapValue(1)}, {2, MapValue(2)}};
cout<<"-----cout key[2]-----"<<endl;
cout<<idName[2]<<endl;
cout<<"-----cout key[5]-----"<<endl;
cout<<idName[5]<<endl;
cout<<"------- runs here means, does't crash-------"<<endl;
Вывод как указано ниже:
-------create map<int, MapValue>-------
ctor: 1
ctor: 2
dtor: 2
dtor: 1
dtor: 2
dtor: 1
-----cout key[2]-----
MapValue: 2
-----cout key[5]-----
ctor: 0
MapValue: 0
-------runs here means, does't crash-------
dtor: 0
dtor: 2
dtor: 1
Мы видим что: idName[5]
вызывают конструкцию карты {5, MapValue(0)}
для вставки в idName.
, Но если, Вы вызываете функцию членства idName[5]
, затем катастрофические отказы программы:
cout<<"-------create map<int, MapValue>-------"<<endl;
map<int, MapValue> idName{{1, MapValue(1)}, {2, MapValue(2)}};
idName[5].toString(); // get crash here.
cout<<"------- runs here means, doesn't crash-------"<<endl;