2013-11-24 2 views
0

У меня есть C++ код следующим образом:Могу ли я получить значение из std :: map без сбоев, если ключ не существует?

if(rtstructure.find(varName) != rtstructure.end()) { 
    rtdef = rtstructure[varName]; 
} 

где rtstructure является станд :: карта с станд :: строка для ключа. Этот код работает, но кажется, что это отходы, чтобы он дважды искал тот же ключ. Если я опускаю случай if вокруг назначения, программа сработает, если varName указывает на ключ, который не существует.

Можно ли в одной операции с картой найти ключ в std :: map и получить его значение, если оно существует, без сбоев, если оно не существует?

+1

Ваша программа обычно не сбой. Вы используете 'map ' случайно? Также обратите внимание, что 'map :: find' возвращает итератор, вы можете с радостью использовать понятие« значение »итератора (' second') – Zeta

+0

Да карта std :: map rtstructure; где rtobject_t - это структура. –

+0

Итак, оператор [] возвращает новый неинициализированный указатель, если ссылается на член, который не существует. –

ответ

5

find дает вам std::map<>::iterator, который содержит/указывает на std::pair<>. Итератор может быть сохранен и повторно использован (если вы не сделали ничего, чтобы сделать его недействительным, например erase).

// i don't know the type of rtstructure so i use auto 
// you can replace it to the correct type if C++11 is not available 
auto it = rtstructure.find(varName); 
if(it != rtstructure.end()) { 
    rtdef = it->second; 
} 
Смежные вопросы