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迭代器在单个对象上的主要内容,如果未能解决你的问题,请参考以下文章