【问题标题】:STL looping in reverse through map C++STL通过map C++反向循环
【发布时间】:2013-03-13 16:28:04
【问题描述】:
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() 是第一个元素吗?如果有,如何解决?

【问题讨论】:

  • “无法访问”是什么意思?在这里,当left == beginning 没有进入while 循环时,显然它没有得到处理

标签: c++ loops map stl


【解决方案1】:

您可以使用rbegin()rend()

请看这里http://www.cplusplus.com/reference/map/map/rbegin/

【讨论】:

    【解决方案2】:

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

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

    map<player, int>::reverse_iterator it = game.rbegin()
    
    for (it = game.rbegin(); it != game.rend(); it++)
    {
    }
    

    【讨论】:

    • 谢谢!这是可行的,但我真的需要从刚刚插入的表格开始,因为地图很大,从最后开始循环所有元素很耗时。
    【解决方案3】:

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

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

    【讨论】:

    • 我试过这个,但是当我运行程序时:“表达式:map/set iterator not dereferencable”
    • 是的 - 面对 game-&gt;find(player(x, y)) 在开头返回元素,这并不可靠。我做了一个小改动。
    【解决方案4】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-12-31
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 2012-01-02
      • 2016-01-05
      相关资源
      最近更新 更多