使用C ++ std :: list iterator替换列表中的项目

时间:2013-06-18 06:54:15

标签: 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 tempi(i);
        ii=*i;
        jobs.erase(tempi);
        recursiveFunction(jobs,...);
        jobs.insert(i,ii);
    }
}

正如我所发现的那样,任何指向被删除位置的指针都会失效,因此我无效。有没有办法以这种方式重新插入工作号码?没有创建每个递归的新列表的性能影响吗?

有没有办法使用列表迭代器以外的东西?

2 个答案:

答案 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再次指向同一元素
  • 将变量(例如itmpElem)声明为尽可能本地化,具有良好的风格和可维护性
  • 为变量提供有意义的名称

根据功能的不同,可能还有其他可能性来实现您的目标。这样,您将处理列表元素的每个子集,并且多次处理其中的许多元素。考虑列表以获得内容{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 ...