[英]How to initialize std::vector from C-style array?
從 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);
您使用初始化一詞,因此不清楚這是一次性分配還是可以多次發生。
如果你只需要一次初始化,你可以把它放在構造函數中並使用兩個迭代器向量構造函數:
Foo::Foo(double* w, int len) : w_(w, w + len) { }
否則按照之前的建議使用assign:
void set_data(double* w, int len)
{
w_.assign(w, w + len);
}
嗯,Pavel 很接近,但是還有一個更簡單和優雅的解決方案來從 ac 樣式數組初始化順序容器。
在你的情況下:
w_ (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 風格的數組作為它的第一個參數。 它只是碰巧通過引用來獲取它。
這個怎么運作
[更新:有關學習大小的更全面討論,請參見此處]
這是一個更通用的解決方案:
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++ 中,您可以傳遞對數組的引用。
通過引用傳遞數組需要類型完全匹配。 數組的大小是其類型的一部分。 這意味着我們可以使用模板參數 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> vec(carray,carray+carray_size);
或具體問題:
std::vector<double> w_(w,w+len);
基於以上:不要忘記您可以將指針視為迭代器
std::vector<double>::assign
是要走的路,因為它的代碼很少。 但它實際上是如何工作的? 它不是調整大小然后復制嗎? 在 STL 的 MS 實現中,我正在使用它正是如此。
恐怕沒有更快的方法來實現(重新)初始化您的std::vector
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.