Что происходит, если я считал значение карты, где ключ не существует?

map<string, string> dada;
dada["dummy"] = "papy";
cout << dada["pootoo"];

Я озадачен, потому что я не знаю, рассмотрело ли это неопределенное поведение или нет, как знать, когда я запрашиваю ключ, который не существует, сделайте я просто использую, находят вместо этого?

62
задан 12 April 2012 в 17:33

1 ответ

Если оператор [] не находит значение для обеспеченного ключа, он вставляет один в том положении.

, Но необходимо отметить , что, если Вы посещаете 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;
1
ответ дан 31 October 2019 в 14:14

Другие вопросы по тегам:

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