gpt4 book ai didi

c++ - 每次循环迭代后递减迭代器显示奇怪的行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:41:33 24 4
gpt4 key购买 nike

我创建了一个程序来尝试练习列表数据结构的语义。我注意到以下代码片段有一个奇怪的区别:

第一个代码:

#include<iostream>
#include<list>

using namespace std;

int main() {
list<int> l;
int n = 100;
for(int i = 0; i < n; i++) {
l.push_back(i);
}
list<int>::iterator it = l.end();
it--;
for(; !l.empty(); it--) {
cout << "the size of l is " << (int) l.size() << endl;
l.erase(it);
}
}

第二个代码:

#include<iostream>
#include<list>

using namespace std;

int main() {
list<int> l;
int n = 100;
for(int i = 0; i < n; i++) {
l.push_back(i);
}
list<int>::iterator it = l.end();
it--;
for(; !l.empty();) {
cout << "the size of l is " << (int) l.size() << endl;
l.erase(it--);
}
}

这两段代码的目标都很简单 - 简单地删除列表中的所有元素。

它们之间唯一的区别是列表迭代器递减的地方。在第一个代码示例中,我使用 for 循环控制流来递减迭代器。第二,我使用后递减运算符来递减迭代器。

根据我的理解,上面的代码示例应该是等效的,因为我在从列表中删除一个元素后立即递减了迭代器。此外,根据 STL 文档,只有列表中已删除元素的迭代器无效。所以不应该有任何未定义的行为。

问题是,第二个代码示例按预期工作 - 它在删除列表中的所有元素后停止。然而,对于第一个样本,名单规模甚至可能变成负数?!当我尝试增加列表中元素的初始数量时,第一个程序中途崩溃。

有人可以告诉我为什么这些代码示例的行为不同吗?

最佳答案

第一个代码有未定义的行为。如您所说,erase 使迭代器无效,之后求值的 it-- 导致 UB。

第二个代码没问题;请注意评估顺序不同。 it-- 将递减迭代器,然后返回原始值(这是后递减运算符的要点)。原始值稍后传递给 erase。递减发生在 erase 之前,所以没问题。

关于c++ - 每次循环迭代后递减迭代器显示奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56660920/

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