C++ 列表迭代和擦除
C++ List Iteration and erasing
编辑:这个问题专门指 std::lists - Stack Overflow 上的其他类似问题指的是 std::vectors
我正在使用 C++,在遍历 std::list 时无法从中删除元素。我有一个自定义列表 class('Objects' 为了这个问题),我的代码如下所示:
for(auto i : Objects)
if(i.EraseFlag == true)
{
i = Objects.erase(i);
}
我收到错误:'no matching function for call to std::list::erase(Object&)'
我相信这是迭代列表、擦除元素和 return 考虑擦除的迭代器的正确方法(从 C++11 开始),但显然我正在做一些事情错误的。以前在使用向量时,我会使用 'Objects.erase(Objects.begin() + i)',其中 i 是 for 循环中的一个整数,但考虑到列表的访问要求,这将不起作用。
感谢帮助。
谢谢
成员函数erase
处理迭代器。
对于这样的任务,使用普通的 for 循环是正确的。例如
for ( auto it = Objects.begin(); it != Objects.end(); )
{
if ( it->EraseFlag ) it = Objects.erase( it );
else ++it;
}
另一种方法是使用成员函数remove_if
。例如
Objects.remove_if( []( const auto &value ) { return value.EraseFlag; } );
编辑:这个问题专门指 std::lists - Stack Overflow 上的其他类似问题指的是 std::vectors
我正在使用 C++,在遍历 std::list 时无法从中删除元素。我有一个自定义列表 class('Objects' 为了这个问题),我的代码如下所示:
for(auto i : Objects)
if(i.EraseFlag == true)
{
i = Objects.erase(i);
}
我收到错误:'no matching function for call to std::list::erase(Object&)'
我相信这是迭代列表、擦除元素和 return 考虑擦除的迭代器的正确方法(从 C++11 开始),但显然我正在做一些事情错误的。以前在使用向量时,我会使用 'Objects.erase(Objects.begin() + i)',其中 i 是 for 循环中的一个整数,但考虑到列表的访问要求,这将不起作用。
感谢帮助。
谢谢
成员函数erase
处理迭代器。
对于这样的任务,使用普通的 for 循环是正确的。例如
for ( auto it = Objects.begin(); it != Objects.end(); )
{
if ( it->EraseFlag ) it = Objects.erase( it );
else ++it;
}
另一种方法是使用成员函数remove_if
。例如
Objects.remove_if( []( const auto &value ) { return value.EraseFlag; } );