list::erase
将迭代器返回到(最后一个)擦除元素之后的元素,并且由于list::insert
将在您传递它的迭代器的元素之前插入,这非常适合您的需求:
using namespace std;
void recursiveFunction(list <int> &jobs,...){
//...
for(auto i = begin(jobs); i != end(jobs);){
//...
auto tmpElem = *i;
i = jobs.erase(i);
recursiveFunction(jobs,...);
jobs.insert(i,tmpElem);
}
}
笔记:
- 与
i=jobs.erase(i)
您有效地增加i
。所以将增量留在 for 循环中。或者i=jobs.insert(i,tmpElem)
稍后使用,所以i
再次指向相同的元素
- 尽可能将变量(例如
i
, )声明为局部变量,以保证良好的风格和可维护性tmpElem
- 给变量起有意义的名字
根据功能的作用,可能还有其他可能性来实现您想要的。这样,您将处理列表元素的每个子集,并且多次处理其中的许多子集。考虑列表有内容{1,2,3}
,这是将要发生的事情(在伪代码中):
recursiveFunction({1,2,3},...)
for-loop, i = &1
erase(1)
recursiveFunction({2,3},...)
for-loop, i = &2
erase(2)
recursiveFunction({3},...) //a
insert(2)
//...
insert(1)
for-looop, i = &2
erase(2)
recursiveFunction({1,3},...)
for-loop, i = &1
erase(1)
recursiveFunction({3},...) //b
insert(1)
//...
insert(2)
//...
a 和 b 行看起来一样,尽管附加参数可能不一样 - 我无法从您的代码中分辨出来。因此,请牢记这一点,并考虑这是否是您真正想要的。