c ++ unordered_map迭代器在单个对象上

Posted

技术标签:

【中文标题】c ++ unordered_map迭代器在单个对象上【英文标题】:c++ unordered_map iterator on single object 【发布时间】: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();对于(项目:临时) 其实可以的。给我一点时间。 【参考方案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 相同(不允许重复)。

以上是关于c ++ unordered_map迭代器在单个对象上的主要内容,如果未能解决你的问题,请参考以下文章

迭代 unordered_map 时如何获取指向键的指针?

c++迭代器在迭代向量时崩溃

Lambda 作为 Python 中的迭代器在第一次迭代时返回函数对象

unordered_map 迭代器会改变吗?

使用迭代器在向量中插入下一个值以映射

为啥允许 std::unordered_map::rehash() 使迭代器无效?