2010-02-03 68 views
3

有簡單的例子:STL:如何重載operator = for <vector>?

#include <vector> 

int main() { 
vector<int> veci; 
vector<double> vecd; 

for(int i = 0;i<10;++i){ 
    veci.push_back(i); 
    vecd.push_back(i); 
} 
vecd = veci; // <- THE PROBLEM 
} 

我需要知道的事情是如何重載operator =,這樣我可以使分配是這樣的:

vector<double> = vector<int>; 

我只是嘗試了很多辦法,但總是編譯器一直在返回錯誤...

有沒有任何選項可以使這段代碼工作而不改變它?我可以寫一些額外的行,但不能編輯或刪除現有的行。 TY。


好的,我明白了。我會用另一種方式問你。 有沒有任何選項可以使這段代碼無需改變就可以工作?我可以寫一些額外的行,但不能編輯或刪除現有的行。 TY。

+0

如果代碼完全像您發佈的那樣,您可以簡單地在全局名稱空間中定義名爲vector的類。那將會被使用。 (現在代碼不會編譯,因爲你在該命名空間之外使用名稱空間'std'的成員的非限定名稱。) 即使由於在C++中隱藏工作而在某處使用了namespace std,這個相當醜陋的黑客行爲也會起作用。 對於確切答案,您必須發佈確切的問題 - 您必須準確定義允許代碼的編輯類型。 –

回答

6

你不能。賦值運算符必須是成員函數,這意味着它必須是不允許修改的std :: vector模板的成員(或者C++標準所說的)。因此,而不是寫一個免費的功能:

void Assign(vector <double> & vd, const vector <int> & vi) { 
    // your stuff here 
} 
+0

有趣的downvote那裏 - 我不認爲你會在乎說爲什麼? – 2010-02-03 15:58:38

+0

+1:使其相等:P –

+0

@Kornel謝謝:-) - 大多數時候我忽略downvotes,但偶爾我認爲他們是一個機會,downvoter有一個技術點,他們太害羞而無法闡明 - 我想我現在應該更清楚。 – 2010-02-03 16:03:55

12

爲什麼不能做一個簡單的方法:

vector<double> vecd(veci.begin(), veci.end()); 

或者:

vecd.assign(veci.begin(), veci.end()); 

兩者都支持開箱即用:)

+0

@David,我知道,但他們可能是STL心態中最優雅的解決方案。 –

+0

(我誤刪了評論)我知道,我同意這是最好的解決方案。任何其他解決方案最終都會在內部調用這個解決方案,或者重新實現分配的內部細節。 –

0

如果這是一個謎題,這將工作...

#include <vector> 

int main() 
{ 
    vector<int> veci; 

    { 
     vector<double> vecd; 
    } 

    vector<int> vecd; 

    for (int i = 0; i < 10; ++i) 
    { 
     veci.push_back(i); 
     vecd.push_back(i); 
    } 

    vecd = veci; // voila! ;) 
}