在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
作为输出。当我在集合中插入更多元素时,输出将增加,并且始终等于集合中元素的总数。
为什么会这样?
取消引用end()
迭代器是未定义的行为,因此任何事情都可以发生。理想情况下,您将当机,但不幸的是,这里似乎并非如此,所有“似乎”都可以正常工作。
因为它没有引用有效的元素,所以不能取消引用
可以,如您的测试代码所示。但是,不应被取消引用。
尽管它是未定义的行为,但是在这种特定情况下,观察到的行为可能是由于所使用的标准库的实现细节所致。
std::set::size()
具有O(1)复杂度,但是std::set::size()
是基于节点的容器(内部为二进制搜索树)。因此,大小需要与数据结构一起存储在某处。可能是std::set
迭代器指向的位置是存储大小的两倍,并且有机会,您可以访问它。
s.end()不引用集合的最后一个元素,它表示集合结束的位置。因此,如果您的集合具有(1,4,2),则s.end()将指向2之后的位置。如果您想要集合中的最后一个元素,可以使用以下方法减少迭代器:
end()
然后您的提示将打印“ 2”。