插入后使用 set::begin() 迭代器
Using set::begin() iterator after insertion
请考虑以下代码:
std::set<int> s;
auto it = s.begin();
s.insert(1);
s.insert(2);
std::cout << *it << std::endl;
输出(至少对我来说)是2
.这是怎么回事?取消引用时it
的状态如何?
我知道当我在空集上调用begin()
时,我会得到一个相当于 end()
的迭代器。我还知道,在set
上调用insert
不会使其迭代器失效。迭代器是否以某种方式等同于end()
即使我现在已将元素插入set
,因此现在我得到了未定义的行为?这是标准定义的吗?
当您在此处调用 s.begin()
时,它会返回一个结束迭代器,因为容器为空。 此迭代器不会因插入而失效:每次插入后,此迭代器仍然是结束迭代器。
会导致程序表现出未定义的行为(不能取消引用结束迭代器)。
迭代
器it
仍然等于s.end()
。取消引用结束迭代器是未定义的行为。这就是你所看到的。例如,试试这个
if (it == s.end())
{
cout << "at endn";
}
这是法典。
第一种情况下的"it"指向s.end(),这是fantom元素的地址。fantom 元素的地址只不过是容器中最后一个元素之后"不存在"元素的地址。一旦集合被修改,在插入之前最初指向 s.end() 的"it"可能与插入后的 s.end() 不同。
因此,取消引用"it"将导致未定义的行为。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 我的代码在作为参数传入 .begin() 时不起作用,但在我将 .begin() 转换为迭代器后工作
- 迭代器返回 vector::begin()
- C++ unordered_set的迭代器 begin() 是否总是指向相同的元素
- 如果对于某些有序的容器s,例如迭代器s.begin(),例如x,例如S是一组
- 由set2.begin()返回的迭代器类型
- 插入后使用 set::begin() 迭代器
- 减少 begin() 迭代器,然后再次增加它
- std::map::begin() 之前的 STL 迭代器
- map的begin迭代器无法使用c++
- 迭代器begin()应该包含3,输出为2
- 带有std::begin()、std::end()问题的C++11自动迭代器类型
- 为什么迭代器在与map.begin()一起使用时预先增加了
- 为我的向量包装器和迭代器返回'begin'和'end'函数返回什么?
- 使用concurrent_vector迭代器的算术:假设从迭代器中减去'begin ()'会给出索引是否安全?
- 为什么stl_tree.h中的end()返回对迭代器对象的引用,而begin()返回object ?
- 自减迭代器,直到vector的.begin()
- get begin(VEC) / end(VEC)由它们之间的迭代器实现
- 减去X.begin()如何返回迭代器的索引?
- 通过在getter方法上应用begin()获得的迭代器不允许访问指向列表的第一个元素