我想同时遍历一个有两个迭代器的映射,一个从开始,一个在结束,如下所示。
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
的强项。