STL通过映射C ++反向循环

时间:2013-03-24 00:22:38

标签: c++ loops map stl

const map<player, int>::iterator beginning = game->begin(); 
const map<player, int>::iterator inserted = game->find(player(x, y));
map<player, int>::iterator left = inserted;
while(left != beginning)
{
//some operations here
--left;
}

正如您所见,我想反过来循环遍历地图,在我刚插入之前访问所有元素。问题是,上面的结构不能访问第一个元素,我不明白为什么。任何建议?游戏 - &gt; begin()是第一个元素吗?如果是这样,如何解决?

4 个答案:

答案 0 :(得分:2)

您可以使用rbegin()rend()

请参阅此处http://www.cplusplus.com/reference/map/map/rbegin/

答案 1 :(得分:2)

game.begin()是第一个元素的迭代器。

您可以通过将迭代器分配给rbegin

来从地图的末尾开始
map<player, int>::reverse_iterator it = game.rbegin()

for (it = game.rbegin(); it != game.rend(); it++)
{
}

答案 2 :(得分:1)

以下内容将访问刚刚插入的元素之前的所有元素(不包括刚刚插入的元素)。它还可以防止插入元素之前没有元素的情况:

if (left != beginning) { 
    do {
        --left;
        //some operations here
    } while (left != beginning);
}

答案 3 :(得分:1)

循环中的条件错误。当迭代器为begin时,您要求跳过循环,但实际上您想在这种情况下执行它。

你可以做的事情有很多,会导致代码影响较小的事情可能是将循环更改为无限并在更改迭代器之前添加退出条件:

while (true) {
   // do something
   if (it == begin()) break;
   --it;
}

或者,您可以使用反向迭代器(可以使用当前迭代器初始化)并针对rend()进行测试。