C++ 为什么set::的迭代器以C++;取消对集合中元素数的引用?
在C++-STL中,set::end()返回一个迭代器,指向set容器的最后一个元素。由于它没有引用有效的元素,因此无法取消引用end()函数返回双向迭代器 但当我执行以下代码时:C++ 为什么set::的迭代器以C++;取消对集合中元素数的引用?,c++,stl,iterator,set,C++,Stl,Iterator,Set,在C++-STL中,set::end()返回一个迭代器,指向set容器的最后一个元素。由于它没有引用有效的元素,因此无法取消引用end()函数返回双向迭代器 但当我执行以下代码时: set<int> s; s.insert(1); s.insert(4); s.insert(2); // iterator pointing to the end auto pos2 = s.end(); cout<<*pos2; set; s、 插入(1); s、 插入(4); s、
set<int> s;
s.insert(1);
s.insert(4);
s.insert(2);
// iterator pointing to the end
auto pos2 = s.end();
cout<<*pos2;
set;
s、 插入(1);
s、 插入(4);
s、 插入(2);
//指向末尾的迭代器
auto pos2=s.end();
cout取消引用end()
迭代器是未定义的行为,因此允许发生任何事情。理想情况下,你会遇到撞车,但不幸的是,这里的情况似乎并非如此,一切“似乎”都正常
由于它没有引用有效的元素,因此无法取消引用
正如您的测试代码所示,它可以。但是,不应取消对它的引用。尽管它是未定义的行为,但在这种特殊情况下,观察到的行为可能是由于使用的标准库的实现细节
具有O(1)复杂性,但std::set
是一个基于节点的容器(内部是一个二进制搜索树)。因此,大小需要存储在数据结构中的某个位置。可能是end()
迭代器指向一个位置,该位置的大小可作为存储的两倍,您完全有可能访问它。迭代器“end”没有指向容器中的元素,您决不能取消引用它。这样做会导致未定义的行为。