【问题标题】:std::map - Element access without exception and without insertionstd::map - 无异常且无插入的元素访问
【发布时间】:2013-10-10 08:30:41
【问题描述】:

我有一个使用 std::map 的循环模式。

我只想在键存在时检索值,否则我不想插入元素。目前我正在使用count(key) 或find(key)(哪个更好?从文档来看,复杂性似乎是相同的),如果它们返回一个正值,我就可以访问地图。但是我想避免在地图上使用两个操作。比如:

map<string, int> myMap;
int returnvalue;
boole result = myMap.get("key1",returnValue)
if(result){
  \\ use returnValue
}

阅读cplusplus.com 上的 std::map 文档,我发现了两个用于访问地图元素的函数:

  • at(): 如果密钥不存在则抛出异常
  • []: 如果键不存在则插入一个新值

它们都不能满足我的需要。

【问题讨论】:

  • 你为什么要避开std::map::find??
  • @billz 没有理由,我忘了 find 返回一个迭代器。

标签: c++ stdmap


【解决方案1】:

使用map::find:

auto it = myMap.find(key);

if (it != myMap.end())
{
    // use it->second
}
else
{
    // not found
}

这部分很简单。更难的问题是当你想查找一个元素是否存在并且如果存在就返回它,否则在那个键处插入一个新元素,所有这些都不需要搜索映射两次。为此,您需要使用lower_bound,然后使用提示插入。

【讨论】:

    【解决方案2】:

    使用count() 确保密钥存在 然后使用find() 得到 k/v 对

    if (myMap.count(key))
    {
        auto it = myMap.find(key)
    }
    else
    {
    // not found
    }
    

    【讨论】:

    • 这是个坏建议。使用find 来确定元素是否存在,如果存在,则使用它返回的迭代器来访问该元素。查找两次是没有意义的(我还没有找到std::map&lt;&gt;::count 的合理用途)。
    • 这不是很有效。请改用 Kerrek 的答案。
    • count 如果您想将此想法扩展到多图也不是一个好习惯,因为当您想知道数字是否非零时,您可能会计算一个很大的数字.
    猜你喜欢
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    相关资源
    最近更新 更多