为什么容器提供“begin
”/“end
”迭代器,而算法需要“first
”/“last
”迭代器?
例如:
vector
提供.begin()
和.end()
(cppreference.com,cplusplus.com)。
sort
需要参数first
和last
(cppreference.com,cplusplus.com)。
编辑:发现更大的差异。使用“first
/ last
”不仅仅是算法,它还是容器构造函数(如vector(first, last, ...)
)。
我没有检查所有容器和算法,但确实检查了一些,所有容器都提供了begin
/ end
,所有算法都需要first
/ last
(或first1
和first2
等变体。)
这有充分的理由吗?对我来说,如果他们都使用相同的话会更有意义。最好是begin
和end
,因为我不喜欢last
,因为这听起来具有包容性,但却不是。对于算法,它只是意味着要处理的范围的开始和结束,就像现在的第一个和最后一个意思一样。
答案 0 :(得分:10)
first
和last
可以是任意两个迭代器,只要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
/ first
和end
/ last
外,C ++标准库还介绍了可选的序列操作front()
和back()
。这里的命名差异很容易理解,因为操作必须在同一个容器上可用,并且back()
是包容性的。
答案 2 :(得分:5)
begin
和end
,但它们可以是任何迭代器。在接口上使用不同的名称会强调您作为用户负责传递一对有意义的first
和last
迭代器的事实。
另一方面,算法的一个弱点是它们没有提供将容器作为参数的方法,而在大多数情况下,您只需要算法从begin
到end
迭代器。