【问题标题】:Loop through a list of items in a different order in each iteration在每次迭代中以不同的顺序遍历项目列表
【发布时间】:2016-09-06 23:32:00
【问题描述】:

所以我有一个循环,在每次迭代中,我想以不同的顺序遍历整个循环,直到满足结束条件。

在每次迭代期间,控制我想要通过循环的顺序的变量会发生变化。

例如,

    while (endCondition == false){
        Item1;
        Item2;
        Item3;
    }

第一次进入循环时,我希望它按照 1、2、3 的顺序进行。第二次:2,1,3... 以此类推(只是手头不知道第n次迭代的顺序)

有没有办法实现这一点?欢迎所有建议!

编辑:我知道上一次迭代结束时的迭代顺序。我想知道如何执行该排列。

Item1、Item2、Item3 是将元素压入堆栈的函数。循环一直运行,直到 endCondition 元素被推送。在每次迭代结束时,顶部元素用作参考,以便在下一次迭代中使用上述函数再添加 3 个元素。我想优先考虑推入堆栈的元素以更快地到达 endCondition。 而优先级的顺序将取决于顶部元素与 endCondition 的接近程度。

    while(maze[currPos_y][currPos_x] != DESTINATION){

        int flag = 0;

        //Adding all open spaces around current position to stack
        if(maze[currPos_y + 1][currPos_x] == OPEN){
            path.push(currPos_y+1, currPos_x);
            flag++;
        }

        if(maze[currPos_y][currPos_x + 1] == OPEN){
            path.push(currPos_y, currPos_x + 1);
            flag++;
        }

        if(maze[currPos_y][currPos_x - 1] == OPEN){
            path.push(currPos_y,currPos_x - 1);
            flag++;
        }

        if(maze[currPos_y - 1][currPos_x] == OPEN){
            path.push(currPos_y - 1, currPos_x);
            flag++;
        }

        //If path is blocked
        if (flag <= 1){
            path.pop();
        }

        currPos_x = path.top_x();
        currPos_y = path.top_y();

}

path 是我实现的堆栈。堆栈没有问题,工作正常。

如您所见,如果二维数组maze 的大小很大,则此代码将运行很长时间。所以我想通过DESTINATION 的方向让它更快。所以最接近DESTINATION的位置会被推到最后,以便最先访问。

【问题讨论】:

  • 你的意思是你想随机排列循环中的 n 项吗?或者你的意思是你知道迭代开始时的顺序是什么,只是想知道如何执行排列?
  • @RobertPrévost 我知道每次迭代开始时的顺序是什么,并且想知道如何执行排列。我将编辑问题
  • 如果我对你的理解正确,你可能想看看std::next_permutation
  • 排列是如何描述的?
  • @Yakk 我已经编辑了这个问题,提供了关于我希望完成的更多细节。希望有帮助

标签: c++ algorithm loops


【解决方案1】:

在我看来,花园品种std::map 是合适的容器。

根据您问题中提供的信息,您似乎知道为对象的每个实例分配了哪些序数值。您知道哪个对象是对象 #1,哪个对象是对象 #2,哪个对象是对象 #3,以此类推。

如果是这样,那么只需将您的对象放入一个

std::map<int, object_type> m;

然后,当您有[1,2,3] 的订单时,继续访问m[1]m[2],然后访问m[3],对您的对象做您想做的事情。

然后,如果在下一次迭代中您的访问顺序是 [3,1,2],请继续使用 m[3]m[1]m[2] 做您的事情。

如果你的类没有默认构造函数,可能会有点不方便,而且你不能使用operator[];如果是这样的话,如果需要的话,这只是一个小细节。

【讨论】:

  • 我是否遗漏了什么或者一个数组/向量在这里就足够了?
  • 我想我明白你在说什么。但是,如果我的项目是功能怎么办。那我将如何创建地图?我是 C++ 新手。所以这个问题可能看起来很幼稚。
【解决方案2】:

您可以试试下面的代码。不知道你是如何找回模式的,我还没有解决这部分问题。这至少应该为您提供另一种相当传统的方法。

#include <iostream>
#include <vector>

using namespace std;

int subtractOne(int num){
    return num - 1;
}

vector<int> patternIteration(vector<int> pattern, vector<int> nums){
    vector<int> ret;
    for (int i = 0; i < pattern.size(); i++){
        ret.push_back(subtractOne(nums.at(pattern.at(i))));
    }
    return ret;
}

int main(int argc, const char * argv[]) {
    vector<int> answer = patternIteration({2, 3, 1, 0}, {5, 1, 3, 8});

    for (int i = 0; i < answer.size(); i++){
        cout << answer.at(i) << " \n";
    }
    return 0;
}

【讨论】:

    猜你喜欢
    • 2019-01-25
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2023-03-25
    • 2020-11-23
    • 2010-10-06
    相关资源
    最近更新 更多