2014-03-01 42 views
1
void setVector(vector<string> aStringVec) 
{ 

    for(std::vector<string>:: iterator s = str1.vec.begin(); s != str1.vec.end(); ++s) 
    { 
     classVector.pushback(*s); 
    } 

} 

如果我classVector = aStringVec,classVector將指向指針aStringVec的第一元素,由於矢量被認爲是陣列,並且可能會消失,因爲這是在堆棧上,對?設置器在C++類矢量

那麼這是爲類矢量編寫setter的正確方法,我可以在任何地方調用它嗎?

+3

向量不是數組,因此'aStringVec'不是一個指針。你希望你的函數簽名看起來像這樣:'void setVector(vector &aStringVec)'。然後它會按照你想要的方式工作。 –

+0

好吧,我不必這樣做,但是它的效率更高。 +1也許你是對的,但我不認爲我們可以直接將一個向量X分配給一個類向量,如果我錯了,請糾正我。 – OnTheFly

+0

@VioletGiraffe做出這個答案。 –

回答

2

如果你真的想設置的東西,最好的辦法是這樣的

void setVector(vector<string> aStringVec) 
{ 
    classVector.swap(aStringVec); 
} 

這確保了classVector持有的函數參數的內容的副本。

您在代碼中試圖執行的操作是將元素附加到classVector,同時引發整個輸入向量的不必要副本。

+0

這比classVector = std :: move(aStringVec)更好還是更差? –

+0

@AlanStokes大概差不多。在兩種情況下,都必須清除'classVector'的原始數據,其餘部分都是簡單的O(1)操作。 – juanchopanza

1

根本不需要循環來將元素附加到現有矢量。使用vector::insert

void setVector(vector<string> const& aStringVec) 
{ 
    classVector.insert(classVector.end(), aStringVec.begin(), aStringVec.end()); 
} 

我將函數參數改爲const&const,因爲您不打算在函數內修改輸入向量,而應該通過引用而不是按值來傳遞,以避免不必要的複製。

相反,如果你想與輸入參數的來代替的classVector內容,那麼你的功能應該是

void setVector(vector<string> aStringVec) 
{ 
    classVector = std::move(aStringVec); 
} 

在這種情況下,你應該按值傳遞的參數,因爲你要移動從它的功能。

+0

雖然語義不同。第一個不是真正的二傳手,它是一個appender。 – juanchopanza

+1

@juan我同意,但是OP有一個調用'push_back'的循環,而沒有事先調用'clear',這就是爲什麼我想他可能想要追加,而不是替換內容。 – Praetorian