c++ - STL 有序容器如何知道它们的结束?

标签 c++ c++11 stl stdmap stdset

我知道该标准并没有规定 STL 容器必须实现的方式,而是规定了每个容器的一组要求。

然而,众所周知,STL 有序容器通常实现为 red–black trees .

您可以使用它们各自的迭代器来迭代 std::setstd::map 的元素,或者从 C++11 开始使用范围循环。

然而,令我困惑的是,STL 中的有序容器如何“知道” 它的“结束”。或者换一种说法,因为它们被实现为树, 容器的末端是如何实现的或可能是 实现了吗?

我知道标准规定了§23.2.1/c 一般容器要求(Emphasis Mine):

begin() returns an iterator referring to the first element in the container. end() returns an iterator which is the past-the-end value for the container. If the container is empty, then begin() == end();

好的,对于连续容器来说,这很容易,但是如何为树实现这种“过去的”?

最佳答案

我刚刚检查了 Visual Studio 2013 STL 中 map 容器的实现,下面是 end 的实现方式。构造map时,分配RB树的头元素,并声明该元素为容器的末端。

当您通过有效的迭代器遍历容器时,operator++operator-- 只是跳过 head 元素。当你到达树的最后一个元素并增加一个迭代器时,它会向上爬(寻找右子树)并最终到达树的头部,即 end

关于c++ - STL 有序容器如何知道它们的结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33655055/

相关文章:

c++ - UDP 包丢失因包大小而异

c++ - 从源代码编译虚幻引擎后缺少dxgi.lib

c++ - 汇编代码中的静态值

c++ - priority_queue 在 Debug模式下变得非常慢

C# 如何解析 STL 文件。当前函数没有正确地将顶点链接到面中。算法错误

c++ - 返回迭代器

C++ 使用 makefile 链接到库(newbe)

c++ - 全高清 2D 纹理内存 OpenGL

c++ - 在 C++11 中打印 std::bitset

C++抽象类无法实例化