std::list擦除不兼容的迭代器
std::list erase incompatible iterator
我有一个包含对象的列表。我从那个列表中得到一些项目,并对这些项目做一些事情。若工作完成并没有错误,我希望从列表中删除这些项目。之后,在擦除时,我得到了不兼容迭代器的异常。我知道tmp是不同的列表。但是如何解决这个问题呢?
#include <list>
class A
{
public:
A(int i):i_(i){}
private:
int i_;
};
int _tmain(int argc, _TCHAR* argv[])
{
std::list<A> list;
A a(1), b(2), c(3);
list.push_back(a);
list.push_back(b);
list.push_back(c);
std::list<A> tmp;
tmp.insert(tmp.end(), list.begin(), list.end());
// do something with tmp
// if all is ok, then erase what is done
list.erase(tmp.begin(), tmp.end());
return 0;
}
CCD_ 1并不总是得到完整的CCD_ 2。它可以复制list
的一部分,所以我不想清除整个list
。
不能使用另一个列表的迭代器从一个列表中擦除。迭代器"指向"列表中的某个节点。它指向特定列表中的某个。当您将这些内容复制到另一个列表中时,您现在有两个带有两组节点的列表。迭代器只指向其中一个副本,而不是同时指向这两个副本。
在程序中,std::list
析构函数将导致列表清理,因此您甚至不需要进行显式清除。
正如其他人所说,你可以使用clear来清除列表中的内容。但我不能100%确定这就是你的意思。你的意思是删除列表中所有也在tmp中的内容吗?如果是这种情况,那么您可能希望将remove_If与谓词一起使用
class CIsContainedInOtherList
{
private:
const std::list<int>& m_list;
public:
CIsContainedInOtherList(const std::list<int>& list);
// return true if val is in m_list
bool operator()(const int& val) const
{
std::list<int>::const_iterator iter
= std::find(m_list.begin(), m_list.end(), val);
return (iter != m_list.end())
}
}
int main()
{
...
CIsContainedInOtherList ifInOtherList(tmp);
std::list<int>::iterator iter =
remove_if(list.begin(), list.end(), ifInOtherList);
// remove everything that matched the predicate
list.erase(iter, list.end());
}
我想你想清除你的列表,use,list.clear((此外,在您的代码中:
list.erase(tmp.begin(), tmp.end());
错了!我想你的意思是:
list.erase(list.begin(), list.end());
您正试图使用tmp
的迭代器从list
中擦除-这毫无意义,会擦除什么?
list.erase(list.begin(), list.end());
或者,仅list.clear();
list.erase(tmp.begin(), tmp.end());
//^^^^
台风!
我想你想键入:
tmp.erase(tmp.begin(), tmp.end());
//^^^^
出现错误的原因是,无法使用从另一个列表获得的迭代器范围从一个列表中删除元素。从一个列表中获得的迭代器是从另一个列表获得的迭代器无法访问的。
我有使用boost::iterator_range的想法。它保存范围以备以后删除。可以吗?
typedef std::list<A>::iterator AIter;
std::list<A> tmp;
boost::iterator_range<AIter> range(list.begin(), list.end());
tmp.insert(tmp.end(), range.begin(), range.end());
list.erase(range.begin(), range.end());
听起来你的问题与中的问题类似。你能在遍历std::列表时从中删除元素吗?。你可能会使用类似的解决方案。
相关文章:
- 为什么范围算法与 std 的迭代器不兼容?
- forward_list迭代器不兼容
- 向量迭代器不兼容的错误,用于保存另一个向量的迭代器的向量
- C++,弹出调试断言失败窗口,我得到矢量迭代器不兼容的错误运行时
- 当我发生碰撞检测时,矢量迭代器不兼容
- 迭代器不兼容错误
- 字符串迭代器不兼容错误,当我将字符串转换为矢量<byte>时
- 表达式:字符串迭代器不兼容,调用"SetDllDirectory"
- 如何消除"矢量迭代器不兼容"错误?
- 映射/集合迭代器不兼容-检查对象是否在映射中
- 映射/集合迭代器不兼容-检查映射中是否存在键
- 迭代器不兼容的原因
- 矢量迭代器不兼容:DEBUG
- 矢量迭代器不兼容矢量行251
- 矢量迭代器不兼容..但是为什么
- 列出迭代器不兼容断言失败
- C++ STL 向量迭代器不兼容
- 矢量迭代器不兼容:运行时错误
- C++linux获取向量迭代器不兼容
- 获取错误:矢量迭代器不兼容