在每次迭代中以不同的顺序循环遍历项目列表

时间:2016-09-06 23:32:01

标签: c++ algorithm loops

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

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

例如,

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

我第一次进入循环时,我希望它以1,2,3的顺序进行。第二次:2,1,3 ......等等(只有我不知道手前第n次迭代的顺序)

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

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

Item1,Item2,Item3是将元素推入堆栈的函数。循环运行直到推送endCondition元素。在每次迭代结束时,top元素用作参考,在下一次迭代中使用上述函数添加3个元素。我想优先考虑推送到堆栈的元素,以更快地达到endCondition。 优先级的顺序取决于top元素与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是我实现的堆栈。堆栈没有问题,它可以正常工作。

如您所见,如果2D数组maze的大小很大,此代码将会运行很长时间。所以我希望通过DESTINATION的方向来加快速度。因此,最接近DESTINATION的位置将被推送到最后,以便首先被访问。

2 个答案:

答案 0 :(得分:2)

在我看来,像花园一样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[],则可能会稍微不方便;如果是这样的话,如果需要的话,那将只是一个小细节。

答案 1 :(得分:1)

您可以尝试以下代码。不知道你是如何得到这个模式我还没有解决那个部分。这应该给你至少另一种相当传统的方法。

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