为什么可以';我用指针和长度创建一个向量 假设我想从数组中构造一个C++ STL向量(知道它的长度),即我有: size_t length = /* ... */ int *a = new int[length];

为什么可以';我用指针和长度创建一个向量 假设我想从数组中构造一个C++ STL向量(知道它的长度),即我有: size_t length = /* ... */ int *a = new int[length];,c++,vector,constructor,wrapper,object-construction,C++,Vector,Constructor,Wrapper,Object Construction,我可以这样构造向量: std::vector<int> v(a, a + length); std::vector<int> v(a, length); std::向量v(a,a+长度); 但不是这样: std::vector<int> v(a, a + length); std::vector<int> v(a, length); std::向量v(a,长度); 为什么vector类没有后一种构造函数?因为标准库中不需要这样的代码膨胀

我可以这样构造向量:

std::vector<int> v(a, a + length);
std::vector<int> v(a, length);
std::向量v(a,a+长度);
但不是这样:

std::vector<int> v(a, a + length);
std::vector<int> v(a, length);
std::向量v(a,长度);

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

因为标准库中不需要这样的代码膨胀,正如您已经指出的,当功能与现有构造函数完美结合时

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


获取指针和长度更像是一种C字符串习惯用法;请注意,
std::string
确实有这样一个构造函数。

因为标准库中不需要这样的代码膨胀,正如您已经指出的,当功能与现有构造函数完美共存时

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


获取指针和长度更像是一种C字符串习惯用法;请注意,
std::string
确实相应地有这样一个构造函数。

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

template< class InputIt >
vector( InputIt first, InputIt last, 
        const Allocator& alloc = Allocator() );
template
向量(先输入,后输入,
常量分配器&alloc=Allocator());
它将内容从
第一个
复制到
最后一个
(不包括),并且不拥有分配的动态数组的所有权


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

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

template< class InputIt >
vector( InputIt first, InputIt last, 
        const Allocator& alloc = Allocator() );
template
向量(先输入,后输入,
常量分配器&alloc=Allocator());
它将内容从
第一个
复制到
最后一个
(不包括),并且不拥有分配的动态数组的所有权


大多数STL算法使用的是
[begin,end)
范围,为了一致性,这个构造函数也使用。

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


人们通常只想“多一件事”但是,人们很难在最重要的一点上达成一致意见。因此,当你有一个界面可以完成这项工作时,让它增加一个ctr是很难做到的,因为ctr通常不会真正帮助很多人,并且会降低一致性。

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

人们通常只想“多做一件事”,但人们很难就最重要的一件事达成一致意见。因此,当你有一个界面来完成这项工作时,让它增加一个ctr,而ctr通常不会真正帮助很多人,并且会降低一致性,这是一个很难推销的做法

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

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

序列描述方法在C中大量使用;这并不意味着它有利于C++。 请注意不要在C++中使用<代码> MalOC (不在生产代码中,不要在“一次编写”代码中,不要在SO和/或其他地方上使用简单的示例);它给别人一个坏代码示例,并鼓励坏代码的习惯。 为什么vector类没有后一种构造函数

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

序列描述方法在C中大量使用;这并不意味着它有利于C++。


边注:请不要在C++中使用<代码> MalOC (不在生产代码中,而不是在“一次写入”代码中,而不是在SO和/或其他地方的简单示例);它给了别人一个坏代码的例子,并鼓励人们养成坏代码的习惯。

这是一种对一致性的极端需要,即使它没有完美的意义。我告诉你,这都是那些在
fputs
中创建
文件*
的人的错。一致性是好的,对抗膨胀是好的。这两种决策都是好的通常很简单。这是一种对一致性的极端需求,即使它没有完美的意义。我告诉你,这都是那些在
fputs
中创建
文件*
作为最后一个参数的人的错。一致性是好的,对抗膨胀是好的。这两方面的决策通常都很容易。向量如何知道是否以及如何处理LOCA删除内存?向量如何知道是否以及如何取消分配内存?已从示例中删除malloc。我实际上没有使用它:-\n已从示例中删除malloc。我实际上没有使用它:-\