假设我想从一个数组中构造一个C++STL向量(知道它的长度),即我有:
size_t length = /* ... */
int *a = new int[length];
我可以这样构造矢量:
std::vector<int> v(a, a + length);
但不是这样的:
std::vector<int> v(a, length);
为什么向量类没有后一种构造函数?
因为该构造函数是典型的begin
-end
构造函数:
template< class InputIt >
vector( InputIt first, InputIt last,
const Allocator& alloc = Allocator() );
其将内容从CCD_ 3复制到CCD_。
STL的大多数算法都使用[begin, end)
范围,为了一致性,也使用这个构造函数。
C++标准库几乎总是喜欢开始/结束对而不是开始/长度对。这种一致性是有价值的。
人们通常只想要"多一件事",但人们不善于就最重要的一件事达成一致。因此,当你有一个能完成这项工作的界面时,增加一个ctr来增加它的功能是很难的,因为它通常对很多人没有真正的帮助,而且会降低一致性。
因为正如您已经指出的,当功能与现有构造函数完美共存时,在标准库中不需要这样的代码膨胀。
标准容器通常在范围上运行。
取一个指针和一个长度更像是一个C字符串习惯用法;请注意,std::string
确实有这样的构造函数。
为什么向量类没有后一种构造函数?
因为这是多余的。您已经可以在迭代器序列上构造容器(在整个stl中是一致的设计决策),因此额外的构造函数不会添加任何新内容;拥有这种构造函数的唯一原因是,如果在客户端代码中从迭代器对切换到迭代器计数对是不平凡的。
描述序列的方式在C中被大量使用;但这并不意味着它可以成为好的C++。
附带说明:请请不要在C++中使用malloc
(不在生产代码中,不在"一次性编写"代码中,也不用于SO和/或其他地方的简单示例);它给了其他人一个坏代码的例子,并鼓励他们养成坏代码的习惯。