C++ 使用C+替换列表中的项目+;列表迭代器
我的代码的基本结构是:C++ 使用C+替换列表中的项目+;列表迭代器,c++,list,insert,iterator,erase,C++,List,Insert,Iterator,Erase,我的代码的基本结构是: 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
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);
}
}
使用名称空间std;
无效递归函数(列表和作业,…){
列表::迭代器i;
int ii;
//代码缺失
for(i=jobs.begin();i!=jobs.end();+i){
//缺少更多代码
列表::迭代器tempi(i);
ii=*i;
jobs.erase(tempi);
递归函数(作业等);
工作。插入(i、ii);
}
}
正如我发现的,任何指向被擦除位置的指针都是无效的,所以我是无效的。有没有办法以这种方式重新插入工号?没有在每次递归中创建新列表的性能影响
有没有一种方法可以使用列表迭代器以外的东西呢
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);
}
}
第a行和第b行看起来是一样的,尽管附加参数可能不一样——我无法从代码中分辨出来。因此,请记住这一点,并考虑这是否是你真正想要的。 < P>递归似乎不是你的问题的正确工具。如果您有一个包含{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 ... 递归({1,2,3,4}); it.1=(1) 删除1 递归({2,3,4}); it.2=(2) 删除2 递归({3,4}); it.3=(3) 删除3 递归({4}); it.4=(4) 删除4 递归({}) 重新插入4({4}) 重新插入3({3,4}) it.3=(4) 删除4 递归({3}); it.4=(3) 删除3 递归({}) 重新插入3({3}) 重新插入4({3,4}) 重新插入2({2,3,4}) it.2=(3) 移除3个离开({2,4}) ... 等
你到底想干什么?在我看来,您试图擦除一个元素,然后将其插入到使用
erase()
进行迭代时的同一位置,您必须使用函数的返回值进行进一步的迭代。在递归调用中所有这些擦除之后,迭代器i衰减,那么为什么不使用push_back而不是insert呢?相同的列表在多个递归级别上读取,我认为如果没有更高级别读取相同的作业两次,我就无法使用push_back…非常感谢!我应该说我正在使用它来枚举作业序列,如果作业序列不受欢迎,我会提前退出。
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 ...