STL是如何订购容器的
How STL ordered containers know their end?
我知道该标准并没有规定STL容器的实现方式,而是为每个容器规定了一组要求。
然而,众所周知,STL有序容器通常被实现为红黑树。
您可以使用std::set
或std::map
各自的迭代器对它们的元素进行迭代,或者从C++11开始使用范围循环。
然而,令我困惑的是,STL中的有序容器是如何"知道"的它的"结束"。或者换一种说法,因为它们被实现为树,容器的末端是如何实现的,或者它可能是实施?
我知道标准规定了§23.2.1/c一般集装箱要求(Emphasis Mine):
begin()返回一个迭代器,该迭代器引用集装箱end()返回一个迭代器,该迭代器超过了结束值用于容器如果容器为空,则begin()==end();
好吧,对于连续的容器来说,这很容易,但这种"过去的结束"是如何为树实现的呢?
我刚刚检查了map
容器在Visual Studio 2013 STL中的实现,下面是end
的实现方式。当构造map
时,RB树的头元素被分配,并且该元素被声明为容器的末尾。
当您通过有效的迭代器遍历容器时,operator++
和operator--
只需跳过head元素。当你到达树的最后一个元素并增加迭代器时,它会向上爬(寻找右子树),最终到达树的头部,即end
。
所有像这样的"类似列表"的容器都需要有某种哨兵节点作为结尾,因为用户可以获得end()
,在容器中插入一些东西,递减迭代器,递减的end()
必须指向插入的元素。我的理解是,有些实现会为此进行动态分配,有些则会将动态sentinel节点放入容器本身。
相关文章:
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 在C应用程序中运行C++(带有STL)函数
- 使用2个键的cpp-stl::优先级队列排序不正确
- Python中的for循环与C++有何不同
- 在STL容器中使用模板类
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 将stl字符串缩小到小于15个字符的容量
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 检查函数返回类型是否与STL容器类型值相同
- STL算法函数在多个一维容器上的使用
- 在STL - C++中按成绩对学生列表进行排序?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- λ可以适应STL吗?
- 为什么使用 NDK 不能存在不同的 stl 实现?
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- stl::unordered_map 和 stl::vector 的销毁有何不同
- 在STL队列容器中订购
- STL是如何订购容器的