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

时间:2013-12-12 10:16:52

标签: c++ vector constructor wrapper object-construction

假设我想从数组构造一个C ++ STL向量(知道它的长度),即我有:

size_t length = /* ... */
int *a = new int[length];

我可以这样构建矢量:

std::vector<int> v(a, a + length);

但不是这样:

std::vector<int> v(a, length);

为什么vector类没有后一种构造函数?

4 个答案:

答案 0 :(得分:2)

因为该构造函数是典型的begin - end构造函数:

template< class InputIt >
vector( InputIt first, InputIt last, 
        const Allocator& alloc = Allocator() );

将内容从first复制到last(未包含),并且不取得已分配的动态数组的所有权。

大多数STL算法使用[begin, end)范围,为了保持一致性,也使用此构造函数。

答案 1 :(得分:2)

C ++标准库几乎总是喜欢开始/结束对到开始/长度对。 这种一致性是值得的。

人们常常想要“只做一件事”,但是人们非常不同意最重要的事情。因此,当你有一个完成这项工作的界面时,加肥它以增加一个并不经常帮助很多人的ctr,并且会降低一致性是很难的。

答案 2 :(得分:1)

因为正如您已经指出的那样,标准库中不需要这样的代码膨胀,所以该功能与现有构造函数完全匹配。

标准容器通常在范围上运行。

指针和长度更像是一个C弦成语;请注意,std::string 确实具有此类构造函数。

答案 3 :(得分:0)

  

为什么vector类没有后一种构造函数?

因为它会是多余的。您已经可以在迭代器序列上构造容器(整个stl中的一致设计决策),因此额外的构造函数不会添加任何新的东西;拥有这种构造函数的唯一原因是,如果从迭代器对切换到迭代器计数对,则在客户端代码中是非平凡的。

描述序列的方式在C中被大量使用;这并不意味着它会带来好的C ++。

附注:请不要在C ++中使用malloc(不是在生产代码中,不是在“一次写入”代码中,不是在SO和/或上的简单示例别处);它给其他人一个糟糕的代码示例,并鼓励习惯使用错误的代码。