C++ 更改for循环的第三部分后的未使用for循环结果

C++ 更改for循环的第三部分后的未使用for循环结果,c++,for-loop,c++17,extract,C++,For Loop,C++17,Extract,在源文件中使用for loop时,会得到一个未使用的结果。这是最小的源文件(我隐藏了文件头和打印集的功能): //主函数 内部主(空){ 设置测试{3,5}; 打印集(测试); for(auto it=test.begin();it!=test.end();){ 自动节点=test.extract(it); ++它; } 打印集(测试); } 然后我使用命令编译并运行: $g++--版本 g++(德典8.3.0-6)8.3.0 ... (此问题的信息不是很重要) $g++-std=c++17温

在源文件中使用
for loop
时,会得到一个未使用的结果。这是最小的源文件(我隐藏了文件头和打印集的功能):

//主函数
内部主(空){
设置测试{3,5};
打印集(测试);
for(auto it=test.begin();it!=test.end();){
自动节点=test.extract(it);
++它;
}
打印集(测试);
}
然后我使用命令编译并运行:

$g++--版本
g++(德典8.3.0-6)8.3.0
... (此问题的信息不是很重要)
$g++-std=c++17温度cpp
美元/年
[ 3 5 ]
[ ]
现在一切进展顺利,但在我将
for loop
部分改为this之后(我将
++it
替换为
for loop
头部的第三部分):

for(auto-it=test.begin();it!=test.end();+it){
自动节点=test.extract(it);
}
现在的结果是:

$/a.out
[ 3 5 ]
zsh:分段故障(堆芯转储)。/a.out
Zsh
是我正在使用的Linux shell,它不是非常重要的信息。在浏览了一些关于
for loop
like等的网页后,我仍然不知道为什么?是虫子吗?为什么它们不相等并且有两种不同的结果?因为方法
提取
?但是为什么第一部分可以运行呢

谢谢。

来自:

提取节点会使提取元素的迭代器无效

调用
test.extract(it)
后,迭代器
it
不再有效。甚至对它进行递增或与另一个迭代器进行比较都不是定义的操作。提取后,您可以对其执行的唯一安全操作是:

  • 让它被摧毁吧
  • 为它指定一个有效的迭代器
任何其他因素都会导致未定义的行为,因此问题中的两个代码示例都会调用未定义的行为。问一个人为什么做与另一个人不同的事情是一个毫无意义的问题。每次程序运行时,它们可能都会执行不同的操作——包括您希望代码执行的操作

无法对未定义的行为进行推理,这样做几乎总是浪费时间。

要修复代码,您需要复制迭代器,增加原始值,然后提取副本。这正是后增量操作符所做的:

for (auto it = test.begin(); it != test.end();) {
    auto node = test.extract(it++);
}
在本例中,
it
在提取之前发生变异。此示例具有定义良好的行为,将逐个提取集合中的每个元素。

来自:

提取节点会使提取元素的迭代器无效

调用
test.extract(it)
后,迭代器
it
不再有效。甚至对它进行递增或与另一个迭代器进行比较都不是定义的操作。提取后,您可以对其执行的唯一安全操作是:

  • 让它被摧毁吧
  • 为它指定一个有效的迭代器
任何其他因素都会导致未定义的行为,因此问题中的两个代码示例都会调用未定义的行为。问一个人为什么做与另一个人不同的事情是一个毫无意义的问题。每次程序运行时,它们可能都会执行不同的操作——包括您希望代码执行的操作

无法对未定义的行为进行推理,这样做几乎总是浪费时间。

要修复代码,您需要复制迭代器,增加原始值,然后提取副本。这正是后增量操作符所做的:

for (auto it = test.begin(); it != test.end();) {
    auto node = test.extract(it++);
}

在本例中,
it
在提取之前发生变异。此示例具有定义良好的行为,将逐个提取集合中的每个元素。

auto node=test.extract(it)
我认为
it
在这里无效。
auto node=test.extract(it)我认为它在这里无效。