首页 > 解决方案 > 您可以在迭代时从 std::forward_list 中删除元素吗?

问题描述

我正在尝试手动迭代forward_list ,并删除某些元素。我的问题与这个问题基本相同,但有forward_list一点需要注意。

以下代码(仅作为示例),尽管before在调用“erase after”后没有重新访问,但它不起作用(它会产生无穷无尽的垃圾)。

#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;
    }
}

标签: c++forward-list

解决方案


问题是,在erase_after迭代到被擦除元素之后,ieit变得无效;稍后执行++it会导致 UB。

erase_after将迭代器返回到擦除后的元素,您可以将其分配给it. (并++it进入for语句以手动控制它。)

for ( IT it = m.begin(); it != m.end(); )
{
    std::cout << *it;

    if ( *it % 2 == 0 )
    {
        it = m.erase_after( before );
    } 
    else
    {
        before = it;
        ++it;
    }

}

居住


推荐阅读