c++ - 您可以在迭代时从 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;
}
}
解决方案
问题是,在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;
}
}
推荐阅读
- python - Pytorch Softmax 给出 nans 和负值作为输出
- html - css 媒体查询在 if 条件下无效。为什么会这样?
- firebase - 如何使用托管重写来连接 Firebase 托管和云功能
- linux - Docker - 运行时出错(未找到框架“Microsoft.WindowsDesktop.App”,版本“3.1.0”)
- android - Android Gradle 下载库不完整
- javascript - 如何使用 javascript 获取原始 gnss 数据?
- mysql - 获取count mysql列表
- javascript - 如何通过 Javascript 更改 url 名称
- windows - 批处理脚本中的 zip 权限被拒绝
- python - 如何编辑 PersonalDictionary.zip,我可以使用台式计算机手动添加单词并再次导入文件吗?