假设我想从数组构造一个C ++ STL向量(知道它的长度),即我有:
size_t length = /* ... */
int *a = new int[length];
我可以这样构建矢量:
std::vector<int> v(a, a + length);
但不是这样:
std::vector<int> v(a, length);
为什么vector类没有后一种构造函数?
答案 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和/或上的简单示例别处);它给其他人一个糟糕的代码示例,并鼓励习惯使用错误的代码。