为什么C ++中的set :: end迭代器会取消引用集合中元素的数量?

问题描述 投票:3回答:3

在C ++-STL中,set :: end()返回指向set容器的last-the-last元素的迭代器。由于它不引用有效元素,因此无法取消引用end()函数将返回双向迭代器。

但是执行以下代码时:

set<int> s;

s.insert(1);
s.insert(4);
s.insert(2);

// iterator pointing to the end
auto pos2 = s.end();
cout<<*pos2;

它输出3作为输出。当我在集合中插入更多元素时,输出将增加,并且始终等于集合中元素的总数。

为什么会这样?

c++ stl iterator set
3个回答
6
投票

取消引用end()迭代器是未定义的行为,因此任何事情都可以发生。理想情况下,您将当机,但不幸的是,这里似乎并非如此,所有“似乎”都可以正常工作。


2
投票

因为它没有引用有效的元素,所以不能取消引用

可以,如您的测试代码所示。但是,不应被取消引用。


2
投票

尽管它是未定义的行为,但是在这种特定情况下,观察到的行为可能是由于所使用的标准库的实现细节所致。

std::set::size()具有O(1)复杂度,但是std::set::size()是基于节点的容器(内部为二进制搜索树)。因此,大小需要与数据结构一起存储在某处。可能是std::set迭代器指向的位置是存储大小的两倍,并且有机会,您可以访问它。


0
投票

s.end()不引用集合的最后一个元素,它表示集合结束的位置。因此,如果您的集合具有(1,4,2),则s.end()将指向2之后的位置。如果您想要集合中的最后一个元素,可以使用以下方法减少迭代器:

end()

然后您的提示将打印“ 2”。

© www.soinside.com 2019 - 2024. All rights reserved.