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 ...