使用c++ std::list迭代器替换列表中的元素

Replacing items in a list using a C++ std::list iterator

本文关键字:列表 元素 替换 迭代器 c++ std list 使用      更新时间:2023-10-16

我代码的基本结构是:

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);
    }
}

正如我所发现的,任何指向被擦除位置的指针都是无效的,因此I是无效的。有没有办法以这种方式重新插入就业数字?不需要每次递归都创建一个新列表来降低性能?

有没有别的方法可以使用列表迭代器呢?

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看起来是一样的,尽管额外的参数可能不一样——从你的代码中我看不出来。所以请记住并考虑这是否是你真正想要的

递归似乎不是解决您问题的正确工具。如果您有一个包含{1,2,3,4}的列表,并且这三个都符合条件,那么看起来会发生如下情况:

<>之前递归({1,2,3,4});它。1 = (1)删除1递归({2、3、4});它。2 = (2)删除2递归({3、4});它。3 = (3)删除3递归({4});它。4 = (4)删除4递归({})重新插入4 ({4})重新插入3 ({3,4})它。3 = (4)删除4递归({3});它。4 = (3)删除3递归({})重新插入3 ({3})重新插入4 ({3,4})重新插入2 ({2,3,4})它。2 = (3)删除3留下({2,4})…等等……