您可以在遍历 std::forward_list 时从中删除元素吗?
Can you remove elements from a std::forward_list while iterating through it?
我正在尝试手动forward_list
迭代,并擦除某些元素。
我的问题与 this one 基本相同,但有一个 forward_list
警告。
以下代码(仅供示例),尽管在调用“erase after”后没有重新访问before
,不起作用(它会产生无穷无尽的垃圾)。
#include <iostream>
#include <forward_list>
typedef std::forward_list<int>::iterator IT;
int main()
{
std::forward_list<int> m{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
IT before = m.before_begin();
for ( IT it = m.begin(); it != m.end(); ++it )
{
std::cout << *it;
if ( *it % 2 == 0 )
{
m.erase_after( before );
}
before = it;
}
for( int i : m )
{
std::cout << i;
}
}
问题是,在 erase_after
之后,指向被擦除元素的迭代器,即 it
变得无效;稍后执行 ++it
会导致 UB。
erase_after
returns 擦除后元素的迭代器,可以赋值给it
。 (并将 ++it
移动到 for
语句中以手动控制它。)
typedef std::forward_list<int>::iterator IT;
IT before = m.before_begin();
for ( IT it = m.begin(); it != m.end(); )
{
std::cout << *it;
if ( *it % 2 == 0 )
{
it = m.erase_after( before );
}
else
{
before = it;
++it;
}
}
我正在尝试手动forward_list
迭代,并擦除某些元素。
我的问题与 this one 基本相同,但有一个 forward_list
警告。
以下代码(仅供示例),尽管在调用“erase after”后没有重新访问before
,不起作用(它会产生无穷无尽的垃圾)。
#include <iostream>
#include <forward_list>
typedef std::forward_list<int>::iterator IT;
int main()
{
std::forward_list<int> m{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
IT before = m.before_begin();
for ( IT it = m.begin(); it != m.end(); ++it )
{
std::cout << *it;
if ( *it % 2 == 0 )
{
m.erase_after( before );
}
before = it;
}
for( int i : m )
{
std::cout << i;
}
}
问题是,在 erase_after
之后,指向被擦除元素的迭代器,即 it
变得无效;稍后执行 ++it
会导致 UB。
erase_after
returns 擦除后元素的迭代器,可以赋值给it
。 (并将 ++it
移动到 for
语句中以手动控制它。)
typedef std::forward_list<int>::iterator IT;
IT before = m.before_begin();
for ( IT it = m.begin(); it != m.end(); )
{
std::cout << *it;
if ( *it % 2 == 0 )
{
it = m.erase_after( before );
}
else
{
before = it;
++it;
}
}