我知道该标准并没有规定 STL 容器必须实现的方式,而是规定了每个容器的一组要求。
然而,众所周知,STL 有序容器通常实现为 red–black trees .
您可以使用它们各自的迭代器来迭代 std::set
或 std::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/