18

STL 参考似乎在概念上有所不同:

  • 一方面是“序列容器”(数组向量双端队列 forward_list 列表)
  • 另一方面,“关联容器”(set multiset map multimap unordered_set unordered_multiset unordered_map unordered_multimap)。

此外,似乎我们有:

  • 所有实现begin()方法的容器都返回一个指向容器中第一个元素的迭代器。
  • 只有序列容器具有front()返回对容器中第一个元素的引用的方法。

我的理解是,只需取消引用其返回值,就front()可以轻松地根据方法定义该方法。begin()

因此,我的问题是:为什么没有为front()定义方法的所有对象定义begin()方法?(实际上应该是每个容器)

(我想从语义的角度来看,从地图中获取第一个元素的意义不如从向量中获取第一个元素的意义,但我想知道是否有更有效的解释)。

4

5 回答 5

8

你真的必须就那个(comp.lang.c++.std)询问标准委员会,但我的猜测是,是的,它只是没有多大意义。此外,它的含义还不是很清楚。你要root,先预购,先后购,先插入……?序列很清楚:前面是一侧,后面是另一侧。地图是树。

于 2013-06-07T10:16:46.933 回答
5

Front()表示排序;“行中的第一个”。

Begin()意味着让我们从某个地方开始,无论在哪里。

于 2013-06-07T10:16:23.997 回答
2

我推测:

  • front()back()如果不是因为接口最初设计时考虑到可变序列,则不会存在于 Sequence中。front()当您考虑如何将它与push_front()and结合使用时,这是最有意义的pop_front()。对于不可变序列(新来者array是标准中唯一的例子,除非你计算const vector),front()是一个简写*begin(),根本不值得兴奋。

  • 由于非序列有序容器没有push_front(),因此也不值得给予它们front()。您可以将条目添加到map,但您不能指定添加它们的顺序,因为那是密钥的用途。这是序列与有序集合之间的区别。

  • “等等”,你说,“vectorfront()但没有push_front()”。我怀疑这是因为vectorhas back()- 如果您再次使用它,那么使用它来匹配它back()是“不错的” 。front()

不过,这只是推测,基于我对设计有用/令人满意的 API 的了解,以及我对容器 API 的观察。我不知道 Stepanov 对此事的想法,也不知道标准委员会对其讨论的任何记录。

于 2013-06-07T11:22:40.850 回答
0

你是对的,它可以很容易地实现。但问题是这些容器是为特定用途而设计的。拥有一个front()成员意味着容器的目标是有一个明确的顺序。当然map值是有序的,但这更多的是性能问题。当然,任何内部结构都必须从某个地方开始(提供begin()),但有时提供front()or是没有意义的back()

迭代器用于遍历数据,front()成员用于访问明确排序的集合的第一个元素。访问地图的第一个成员没有意义,因为它是关联的。

于 2013-06-07T11:39:52.377 回答
-2

STL 旨在使用迭代器进行遍历。所以我想只对像andfront()这样的容器有意义。listdeque

于 2013-06-07T10:22:12.343 回答