【问题标题】:Can I get a value from std::map without crashing if the key doesn't exist?如果密钥不存在,我可以从 std::map 获取值而不会崩溃吗?
【发布时间】:2013-11-24 22:35:53
【问题描述】:

我有这样的 C++ 代码:

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

其中 rtstructure 是 std::map ,其中 std::string 为键。 此代码有效,但让它搜索两次相同的密钥似乎是一种浪费。如果我在赋值周围省略 if 情况,如果 varName 指向一个不存在的键,程序就会崩溃。

我是否可以在单个映射操作中查找 std::map 中的键并在它存在时获取它的值,如果它不存在则不会崩溃?

【问题讨论】:

  • 您的程序通常不会崩溃。你有没有机会使用map<K,V*>?还要注意map::find返回一个迭代器,你可以愉快地使用迭代器的value概念(second
  • 是的,地图是std::map<:string rtobject_t> rtstructure;其中 rtobject_t 是一个结构体。
  • 显然,如果引用不存在的成员,[] 运算符将返回一个新的未初始化指针。

标签: c++


【解决方案1】:

find 给你一个std::map&lt;&gt;::iterator 持有/指向std::pair&lt;&gt;。迭代器可以保存和重复使用(假设您没有做任何事情来使其无效,例如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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多