Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么set::的迭代器以C++;取消对集合中元素数的引用?_C++_Stl_Iterator_Set - Fatal编程技术网

C++ 为什么set::的迭代器以C++;取消对集合中元素数的引用?

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、

在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、 插入(2);
//指向末尾的迭代器
auto pos2=s.end();

cout取消引用
end()
迭代器是未定义的行为,因此允许发生任何事情。理想情况下,你会遇到撞车,但不幸的是,这里的情况似乎并非如此,一切“似乎”都正常

由于它没有引用有效的元素,因此无法取消引用

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

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

具有O(1)复杂性,但
std::set
是一个基于节点的容器(内部是一个二进制搜索树)。因此,大小需要存储在数据结构中的某个位置。可能是
end()
迭代器指向一个位置,该位置的大小可作为存储的两倍,您完全有可能访问它。

迭代器“end”没有指向容器中的元素,您决不能取消引用它。这样做会导致未定义的行为。