【问题标题】:c++ unordered_map iterator on single objectc ++ unordered_map迭代器在单个对象上
【发布时间】:2017-11-16 21:00:10
【问题描述】:

我有一个字符串和一个 (string, Object) 的 unordered_map。我已经有一些代码在其中迭代地图:

for(auto& item : map) {
    do_something;
}

我想修改它以在字符串非空并且在地图中找到时在 for 循环中执行部分,否则如果字符串为空,则对地图中的所有项目执行此操作。

if(!string.empty()){
    item = map.find(string);
    do_something;
}
else {
    for(auto& item : map) {
        do_something;
    }
}

我可以在不重写 do_something 或创建单独的函数的情况下执行此操作吗?

【问题讨论】:

  • do_something 放入函数本地 lambda 中?
  • 我可以从 map.find() 的对中创建某种迭代器,以便 for 循环保持原样吗?
  • 不确定我是否遵循你的思路
  • 类似 temp = map 或 map.find();对于(项目:临时){}
  • 其实可以的。给我一点时间。

标签: c++ iterator unordered-map


【解决方案1】:

遵循您在 cmets 中提出的思路。您可以用特定范围(由迭代器定义)上的常规 for 循环替换范围 for 循环。要定义它,你需要这样的东西:

auto begin = map.begin(), end = map.end(); // The whole map

if(!string.empty())
  std::tie(begin, end) = map.equal_range(string);
  // constrain range to the single element

for(; begin != end; ++begin) { // loop over it 
  auto& item = *begin;
  // Do something
}

上面的星星是std::unordered_map::equal_range

【讨论】:

  • 除了时间复杂度之外,这似乎很好。我不是很了解内部情况。 equal_range 时间复杂度是否相同?
  • @sum250 - 与此容器的 find 相同(不允许重复)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 2015-01-10
  • 2019-10-26
  • 1970-01-01
  • 2013-04-12
  • 1970-01-01
  • 2021-12-21
相关资源
最近更新 更多