如何从C风格的数组初始化std :: vector?

什么是最便宜的方式来初始化一个C风格的数组的std::vector

例子:在下面的类中,我有一个vector ,但由于外部的限制,数据将作为C风格的数组传递:

 class Foo { std::vector<double> w_; public: void set_data(double* w, int len){ // how to cheaply initialize the std::vector? } 

显然,我可以调用w_.resize() ,然后遍历元素,或者调用std::copy() 。 有没有更好的方法?

不要忘了你可以把指针当作迭代器:

 w_.assign(w, w + len); 

你使用initialize这个词,所以目前还不清楚这是一次性赋值还是可能发生多次。

如果你只需要一次初始化,你可以把它放在构造函数中,并使用两个迭代器vector构造函数:

 Foo::Foo(double* w, int len) : w_(w, w + len) { } 

否则按照以前的build议使用assign:

 void set_data(double* w, int len) { w_.assign(w, w + len); } 

那么,Pavel很接近,但是从ac风格的数组中初始化一个连续的容器,甚至有一个更简单和优雅的解决scheme。

在你的情况下:

 w_ (array, std::end(array)) 
  • 数组会得到一个指向数组开头的指针(没有捕获它的名字),
  • std :: end(array)将得到一个迭代器到数组的末尾。

您可以自动“学习”数组的大小:

 template<typename T, size_t N> void set_data(const T (&w)[N]){ w_.assign(w, w+N); } 

希望你可以像上面那样把接口改成set_data。 它仍然接受一个C风格的数组作为其第一个参数。 它只是作为参考。


怎么运行的

[更新:请参阅此处以了解有关了解尺寸的更全面讨论]

这是一个更一般的解决scheme:

 template<typename T, size_t N> void copy_from_array(vector<T> &target_vector, const T (&source_array)[N]) { target_vector.assign(source_array, source_array+N); } 

这是有效的,因为数组是作为一个数组的引用传递的。 在C / C ++中,你不能将一个数组作为一个函数来传递,而是会衰减到一个指针,并且你失去了大小。 但是在C ++中,你可以传递一个对数组的引用。

按引用传递数组要求types完全匹配。 数组的大小是其types的一部分。 这意味着我们可以使用模板参数N来了解我们的尺寸。

有这个函数返回一个向量可能会更简单。 在适当的编译器优化效果下,这应该比看起来更快。

 template<typename T, size_t N> vector<T> convert_array_to_vector(const T (&source_array)[N]) { return vector<T>(source_array, source_array+N); } 

std::vector<double>::assign是要走的路,因为它的代码很less 。 但实际上它是如何工作的? 不是resize然后复制? 在STL的MS实现中,我正在使用它。

恐怕没有更快的方法来实现(重新)初始化你的std::vector