簡體   English   中英

如何從 C 樣式數組初始化 std::vector?

[英]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))
  • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM