如何从开始和结束同时迭代std::map



我想同时遍历一个有两个迭代器的映射,一个从开始,一个在结束,如下所示。

map<int, int> m;
for (auto i = m.begin(), j = m.rbegin(); i != m.end(), j != m.rend(); ++i, ++j) 
{
}

但出现以下错误。

error C3538: in a declarator-list 'auto' must always deduce to the same type

此外,我还想迭代到代码片段的i < j。这只是从地图的开始和结束的中间。

std::map迭代器是双向的,因此根本不需要使用反向迭代器。

请注意,在幼稚的翻译中:

for (auto i = m.begin(), j = m.end(); i != m.end() && j != m.begin(); ++i, --j) 
{
}

您需要在主体中取消引用(j-1)(这是反向迭代器为您处理的部分(。


此外,我想迭代直到I<代码片段的j

i == j。。。你必须小心你的增量&递减。

类似于:

for (auto i = m.begin(), j = m.end();
i != j && std::next(i) != j;
++i, --j) 
{
}

可能会起作用,但请仔细检查包含0、1、2个元素的容器的逻辑,并确定在这些情况下应该发生什么

for循环的init语句可以为空。为了将变量限制在尽可能窄的范围内,我建议添加一些额外的{}。您可以通过base()从反向迭代器中获得正向迭代器,然后比较两者:

map<int, int> m;
{
auto i = m.begin();
auto j = m.rbegin();
for (; i != j.base() && i != std::next(j.base()); ++i, ++j) 
{
std::cout << i->first << " " << j->first << "n";
}
}

实时演示

正如Useless很好地解释的那样,您需要小心并行递增迭代器并通过!=进行比较。确切地说,当你想以这种方式迭代它的元素时,有人可能会说你使用了错误的容器。按顺序迭代元素不是std::map的强项。

最新更新