使用c++ std::list迭代器替换列表中的元素
Replacing items in a list using a C++ std::list 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);
}
}
正如我所发现的,任何指向被擦除位置的指针都是无效的,因此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})…等等……相关文章:
- C++如何通过用户输入删除列表元素
- 通过动态分配插入列表元素
- 用于编织链接列表元素的Runner Technique
- 无法在C 中删除列表元素
- 如何在不使用循环或迭代器的情况下检查所有列表元素并在满足条件时删除一个
- 将列表元素移动到列表末尾的函数多次不起作用
- 交换链接列表元素
- 当删除列表元素时,在迭代器结束时会发生什么
- 为什么从不同分配器的列表中剪辑列表元素时会有错误消息?以及如何解决
- 打印出列表元素问题
- 我想通过递归获取列表元素的所有置换
- 从C++访问列表元素 (QML) 颜色
- 如何在C++visual studio 2013中将列表元素转换为文本块
- 指向删除后的列表元素的指针
- 正在将指针复制到assign运算符中的另一个列表元素
- 将列表元素插入向量,C++获取其他不需要的值
- 从unordered_set中删除列表元素
- 在C++中打印列表元素的组件
- 提取并转换 boost::p ython::list 的列表元素
- Rcpp犰狳:对列表元素的"-="操作