2010-02-03 67 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! ;) 
}