为什么“开始/结束”与“第一个/最后一个”的差异?

时间:2017-02-12 10:45:29

标签: c++

为什么容器提供“begin”/“end”迭代器,而算法需要“first”/“last”迭代器?

例如:

编辑:发现更大的差异。使用“first / last”不仅仅是算法,它还是容器构造函数(如vector(first, last, ...))。

我没有检查所有容器和算法,但确实检查了一些,所有容器都提供了begin / end,所有算法都需要first / last(或first1first2等变体。)

这有充分的理由吗?对我来说,如果他们都使用相同的话会更有意义。最好是beginend,因为我不喜欢last,因为这听起来具有包容性,但却不是。对于算法,它只是意味着要处理的范围的开始和结束,就像现在的第一个和最后一个意思一样。

3 个答案:

答案 0 :(得分:10)

firstlast可以是任意两个迭代器,只要last不是"之前" first。他们必须是容器的开头和结尾。

答案 1 :(得分:9)

原因很可能是历史性的:这就是Stepanov和Lee所称的,他们是STL的第一个实现者,后来演变为C ++标准库。

这是Stepanov's paper on STL。第47页描述了排序

template <class RandomAccessIterator>
void sort(RandomAccessIterator first, RandomAccessIterator last);

第19页介绍了容器的操作begin()end()

请注意,除begin / firstend / last外,C ++标准库还介绍了可选的序列操作front()back()。这里的命名差异很容易理解,因为操作必须在同一个容器上可用,并且back()是包容性的。

答案 2 :(得分:5)

如果容器和算法以相同的方式命名它们,那么Imho会更加混乱。采用迭代器的算法的全部意义在于它们不必是容器的beginend,但它们可以是任何迭代器。在接口上使用不同的名称会强调您作为用户负责传递一对有意义的firstlast迭代器的事实。

另一方面,算法的一个弱点是它们没有提供将容器作为参数的方法,而在大多数情况下,您只需要算法从beginend迭代器。