1
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;
}

正如你所见,我想反向循环遍历地图,访问我刚刚插入的元素之前的所有元素。问题是,上面的结构不能访问第一个元素,我不知道为什么。有什么建议吗?game->begin() 是第一个元素吗?如果是这样,如何解决?

4

4 回答 4

2

您可以使用rbegin()rend()

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

于 2013-03-24T00:27:04.147 回答
2

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

您可以通过将迭代器分配给从地图的末尾开始rbegin

map<player, int>::reverse_iterator it = game.rbegin()

for (it = game.rbegin(); it != game.rend(); it++)
{
}
于 2013-03-24T00:28:28.397 回答
1

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

if (left != beginning) { 
    do {
        --left;
        //some operations here
    } while (left != beginning);
}
于 2013-03-24T00:29:15.087 回答
1

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

您可以做不同的事情,对代码影响较小的事情可能是将循环更改为无限并在更改迭代器之前添加退出条件:

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

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

于 2013-03-24T00:48:35.940 回答