【问题标题】:How to endlessly loop over map如何无休止地循环地图
【发布时间】:2020-01-24 04:31:03
【问题描述】:

我需要在不停止循环的情况下遍历整个地图。 我的示例有效,但它使用了两个循环,可以修复吗?

我认为只使用一个 for 循环就可以做到这一点

#include <map>

map<int, int>map2;

    map2[1] = 11;
    map2[2] = 12;
    map2[3] = 13;

    for (;;)
    {
        for (auto& a : map2)
        {

            cout << a.first << " : " << a.second << '\n';
        }
    }

【问题讨论】:

  • 为什么需要两个循环?为什么你在地图迭代之前使用无限循环?
  • 您的代码中没有数组。
  • 我正在循环地图,我的程序需要这个。
  • 我认为你的代码已经是最好的方法了。 2个循环。如果您的列表是一个普通数组(不是地图,而是可以由 int 索引的列表),您只需要像这样通过环绕来增加索引:index = (index+1)%yourList.size();
  • 数组就是我的意思地图;我的翻译不好。

标签: c++


【解决方案1】:

使用std::map::iterator。这样您就可以检查迭代器是否在末尾,如果是,则将其重置为开头。

map<int, int>::iterator it;
for ( it = map2.begin(); it != map2.end(); it == std::prev( map2.end() ) ? it = map2.begin() : it++ )
{
    cout << it->first << " : " << it->second << '\n';
}

澄清

it == std::prev( map2.end() ) ? it = map2.begin() : it++

那是三元运算符。您首先询问迭代器是否等于地图中的最后一个元素。我们添加std::prev() 以获取最后一个元素,因为map::end() 为我们提供了past-the-end 值。

it == std::prev(map2.end())

如果它是最后一个元素,则将迭代器设置为地图的开头。

it = map2.begin()

否则迭代器递增,你得到下一个元素

it++

另见:Loop through map

【讨论】:

  • 这个循环可以像我一样捕捉地图变化吗?
  • 是的,每当有新值被推入地图时,它都会检测到。迭代器方法和for(auto&amp; a : map2)差不多,只是增加了迭代器reset
  • 进一步了解迭代器和基于范围的区别:Here
  • 能不能把周期缩短一点?他看起来很长,可读性差。
  • 您使用两个循环的原始解决方案更简洁易读,这就是原因。通常,您可以具有可读性,或“在一个循环中”。
猜你喜欢
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
  • 2012-03-07
  • 2015-07-07
  • 1970-01-01
  • 2016-02-09
相关资源
最近更新 更多