我的代码的基本结构是:
using namespace std;
void recursiveFunction(list <int> &jobs,...){
list<int>::iterator i;
int ii;
//code missing
for(i=jobs.begin(); i != jobs.end(); ++i){
//more code missing
list<int>::iterator tempi(i);
ii=*i;
jobs.erase(tempi);
recursiveFunction(jobs,...);
jobs.insert(i,ii);
}
}
正如我所发现的那样,任何指向被删除位置的指针都会失效,因此我无效。有没有办法以这种方式重新插入工作号码?没有创建每个递归的新列表的性能影响吗?
有没有办法使用列表迭代器以外的东西?
答案 0 :(得分:3)
list::erase
返回超过(last)擦除元素的元素的迭代器,并且因为list::insert
将在您传递iterator的元素之前插入,这非常适合您的需求:
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行看起来一样,虽然附加参数可能不一样 - 我无法从你的代码中看出来。所以请记住这一点,并考虑这是否是您真正想要的。
答案 1 :(得分:0)
递归似乎不是您的问题的正确工具。如果你有一个包含{1,2,3,4}的列表并且所有三个都符合条件,那么看起来就是这样:
recurse({1,2,3,4}); it.1 = (1) remove 1 recurse({2,3,4}); it.2 = (2) remove 2 recurse({3,4}); it.3 = (3) remove 3 recurse({4}); it.4 = (4) remove 4 recurse({}) reinsert 4 ({4}) reinsert 3 ({3,4}) it.3 = (4) remove 4 recurse({3}); it.4 = (3) remove 3 recurse({}) reinsert 3 ({3}) reinsert 4 ({3,4}) reinsert 2 ({2,3,4}) it.2 = (3) remove 3 leaving ({2,4}) ... etc ...