gpt4 book ai didi

c++ - 您可以在迭代时从 std::forward_list 中删除元素吗?

转载 作者:行者123 更新时间:2023-12-01 14:47:09 26 4
gpt4 key购买 nike

我正在尝试遍历 forward_list 手动 ,并删除某些元素。
我的问题与 this one 基本相同, 但带有 forward_list警告。
以下代码(仅作为示例),尽管没有重新访问 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 将迭代器返回到删除后的元素,您可以将其分配给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;
}

}
LIVE

关于c++ - 您可以在迭代时从 std::forward_list 中删除元素吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63299625/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com