为什么std :: map(以及STL中的其他关联容器)没有front()方法?

时间:2013-06-07 10:11:32

标签: c++ map stl iterator containers

STL reference似乎在以下方面产生了概念上的区别:

  • '序列容器'(数组向量deque forward_list列表)一方面
  • 'Associative containers'(另一方面设置multiset map multimap unordered_set unordered_multiset unordered_map unordered_multimap)。

此外,似乎我们有:

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

我的理解是,front()方法可以通过仅取消引用其返回值来轻松定义begin()方法。

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

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

5 个答案:

答案 0 :(得分:4)

Front()表示订购; “排在第一位”。

开始()暗示让我们从某处开始,无论在哪里。

答案 1 :(得分:3)

你真的要向标准委员会询问那个(comp.lang.c ++。std),但我的猜测是,是的,它没有那么多意义。此外,它的含义并不明确。你想要根,预先订购,先订购,先插入......?序列非常清楚:前面是一边,后面是另一边。地图是树木。

答案 2 :(得分:1)

我推测:

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

  • 由于非序列有序容器没有push_front(),因此不值得给它们front()。您可以向map添加条目,但是您无法指定添加条目的顺序,因为密钥适用于此。这是序列与有序集合之间的差异。

  • “挂起”,你说,“vectorfront()但不是push_front()”。我怀疑这是因为vectorback() - 如果您使用的是back(),那么再次使用front()来匹配它会很“好”。

这只是推测,基于我对设计有用/令人满意的API的了解,以及我对容器API的观察。我不了解斯捷潘诺夫对此事的看法,也不了解其在标准委员会中的任何记录。

答案 3 :(得分:0)

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

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

答案 4 :(得分:-1)

STL旨在使用迭代器遍历。 所以我猜front()仅对listdeque等容器有意义。