STL:如何为<vector>重载operator=?

3
有一个简单的例子:
#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
}

我需要知道如何重载运算符=,以便我可以进行这样的赋值操作:
vector<double> = vector<int>;

我刚刚尝试了很多方法,但编译器一直返回错误...

有没有办法让这段代码在不改变它的情况下运行?我可以写一些额外的代码,但不能编辑或删除现有的代码。谢谢。


好的,我明白了。我会用另一种方式问你... 有没有办法让这段代码在不改变它的情况下运行?我可以写一些额外的代码,但不能编辑或删除现有的代码。谢谢。


如果代码完全按照您发布的方式进行,您可以在全局命名空间中简单地定义自己的名为vector的类。然后就可以使用它了。(现在代码无法编译,因为您在该命名空间之外使用了未限定名称的命名空间std成员。) 即使在C++中有using namespace std语句,这种相当丑陋的hack也能够工作,因为隐藏的原理。 对于确切的答案,您必须发布确切的问题 - 您必须明确定义允许对代码进行哪些编辑。 - Jan Smrčina
3个回答

12

为什么不用更简单的方法:

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

或者:

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

两者都被默认支持 :)


@David,我知道,但在STL的思维模式中,它们可能是最优雅的解决方案。 - Kornel Kisielewicz
我知道并同意这是最好的解决方案。任何其他解决方案最终都会在内部调用此解决方案,否则就需要重新实现分配的内部细节。 - David Rodríguez - dribeas

6

你不能这样做。赋值运算符必须是一个成员函数,也就是说它必须是std::vector模板的成员,而你不被允许修改它(或者C++标准是这么说的)。因此,你需要编写一个自由函数:

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

有趣的负评 - 我想你不介意说一下原因吧? - anon
@Kornel 谢谢 :-) - 大多数时候我会忽略负评,但偶尔我认为负评者可能有一个他们不好意思阐明的技术观点 - 我想我现在应该更清楚了。 - anon

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! ;)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接