插入后使用 set::begin() 迭代器

Using set::begin() iterator after insertion

本文关键字:begin 迭代器 set 插入      更新时间:2023-10-16

请考虑以下代码:

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"将导致未定义的行为。