所以我有一个循环,在每次迭代中,我想以不同的顺序遍历整个循环,直到满足结束条件。
在每次迭代期间,控制我想要通过循环的顺序的变量会改变。
例如,
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
的位置将被推送到最后,以便首先被访问。
答案 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;
}