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

Syl*_*inD 14 c++ containers iterator stl map

STL参考似乎使之间的概念上的差异:

  • 'Sequence containers'(数组向量deque forward_list list)一方面
  • 另一方面,'关联容器'(设置multiset map multimap unordered_set unordered_multiset unordered_map unordered_multimap).

而且,似乎我们有:

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

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

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

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

Edw*_*nge 7

你真的必须就那个 (comp.lang.c++.std) 询问标准委员会,但我的猜测是,是的,它没有多大意义。此外,它的含义也没有那么清晰。你想要根,先序,先后序,先插入...?序列很清楚:正面是一侧,背面是另一侧。地图是树。

  • 就我个人而言,我认为如果它确实存在,那么“front()”应该意味着什么。这意味着“begin()”所指的那个,与序列相同。地图有一个顺序,你需要有一个“第一个元素”是一个顺序而不是空的。它们是树的事实大多被 API 隐藏了。你不能以前序、后序或插入顺序迭代 `std::map`,所以你也不应该期望 `front()` 与这些事情有任何关系。 (20认同)
  • “拥有“第一个元素”所需要的只是一个命令,并且不能为空”我突然想到,从数学上讲,这对我来说是一种咆哮。无限集可以有阶但没有最小元素。我不言而喻的是,`std::map` 是有限的。 (2认同)

Eni*_*gma 5

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

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

  • 但在地图中有一个排序 (16认同)
  • @Enigma 不,地图前面总是只有一个元素(好吧,除非它是空的) (4认同)