为什么我不能使用指针和长度创建矢量

Why can't I create a vector using a pointer and length

本文关键字:创建 指针 不能 为什么      更新时间:2023-10-16

假设我想从一个数组中构造一个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和/或其他地方的简单示例);它给了其他人一个坏代码的例子,并鼓励他们养成坏代码的习惯。