【发布时间】:2016-02-12 19:26:28
【问题描述】:
我知道该标准并未规定 STL 容器必须以何种方式实现,而是为每个容器规定了一组要求。
然而,众所周知,STL 有序容器通常实现为red–black trees。
您可以使用 std::set 或 std::map 各自的迭代器来迭代它们的元素,或者从 C++11 开始使用范围循环。
然而,令我困惑的是,STL 中的有序容器如何“知道” 它的“结束”。或者换一种说法,因为它们被实现为树, 容器的末端是如何实现的或可能是 实施了吗?
我知道标准规定了§23.2.1/c 一般容器要求(Emphasis Mine):
begin() 返回一个迭代器,指向第一个元素 容器。 end() 返回一个迭代器,它是过去的值 对于容器。如果容器是空的,那么 begin() == end();
好的,对于连续容器来说,这很容易,但是如何为树实现这种“过去的”?
【问题讨论】:
-
意识到“过去”是一个逻辑概念,而不是物理概念。它的字面意思是当您前进到最后一个有效条目时获得的迭代器,但该迭代器的内部内容可以是任何东西。
-
next() 和 end() 的自然概念来自终止广度优先和深度优先等树遍历,因此各个迭代器在概念上没有什么特别之处。
-
@MarkRansom 很公平,这是一个合乎逻辑的概念。但是你是如何实现这样一个逻辑概念的呢?我的意思是在代码中。
-
我想我的意思是它完全是任意的。根据树的具体实现,可能会有一种自然而明显的方法,但我怀疑你会发现与标准库的实现一样多的不同方法。
标签: c++ c++11 stl stdmap stdset