2014-07-15 33 views
1

我正在學習C++,並且遇到了此函數的問題。我最初傳遞了整個向量,然後傳遞了一個指向該向量的指針;但是我似乎無法從指向矢量的指針賦值。填充矢量<int> *

void fill(std::vector<int> *vec, const int startVal) 
{ 
    const int n = vec->size(); 
    for (int i = 0; i < n; ++i) 
    { 
     vec[i] = startVal + i 
    } 
} 

我該如何在指針(vec)的第i個位置賦值給vector?

我想:

vec->[i] = startVal + i; 
+4

'(* vec)[i]'會起作用。但爲什麼傳遞一個指針?通過一個參考,或兩個迭代器。 – juanchopanza

+0

@juanchopanza:他可能會遵循[_Google C++風格指南_](http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Reference_Arguments):) _「所有通過引用傳遞的參數都必須標記'const'。「_ –

+1

@C64先生,我已經忘記了那些廢話:-)我真的很希望沒有人真正遵循這一點。 – juanchopanza

回答

8

那麼,你應該通過引用傳遞的載體:

void fill(std::vector<int> &vec, int startVal) 

那麼你一定要會行:

vec[i] = startVal + i; 

當你正在使用一個指針,你必須解引用指針,所以:

(*vec)[i] = startVal + i; 
4

你可以去參考指針這樣的:

(*vec)[i] 

vec->operator[](i) 

,但你可以讓你的生活通過傳遞一個參考更容易,

void fill(std::vector<int>& vec, int startVal) 

或調用std::iota,這是一個標準庫算法,實現您的混淆功能命名爲fill功能:

std::vector<int> v = ....; 
.... 
std::iota(v.begin(), v.end(), startVal); 
+0

有沒有什麼方法可以使用'iota',而是在你去時創建元素,而不是分配給默認構造的元素? –

+0

@MattMcNabb不幸的不是。除了傳遞結束迭代器之外,沒有辦法指定範圍的結尾。有一個'iota_n'類型的函數會很好。 – juanchopanza

+0

@MattMcNabb你可以使用generate_n,但我不知道它是否保證線性順序。 –