C++ stl矢量之间的自动转换

C++ stl矢量之间的自动转换,c++,vector,stl,template-argument-deduction,C++,Vector,Stl,Template Argument Deduction,我想要的是用赋值运算符将一个std::vector复制到另一个std::vector,在这个赋值运算符中,myStruct可以被赋值一个int。所以我写了这段代码: #include <vector> #include <iostream> using namespace std; struct myStruct { myStruct(int& a) : _val(a) { } myStruct(int&& a) : _val(a)

我想要的是用赋值运算符将一个
std::vector
复制到另一个
std::vector
,在这个赋值运算符中,
myStruct
可以被赋值一个
int
。所以我写了这段代码:

#include <vector>
#include <iostream>

using namespace std;

struct myStruct
{
   myStruct(int& a) : _val(a) { }
   myStruct(int&& a) : _val(a) { }

   myStruct& operator=(int& a)
   {
      _val = a;
      return *this;
   }

   int _val;
};

int main()
{
   vector<int> ivec;
   ivec.push_back(1);
   vector<myStruct> svec = ivec;

   return 0;
}

但是想象一下,在这种情况下,我想写一个库,并想在库中处理它,这样用户就可以只写
std::vector svec=someFunction()
,其中
someFunction
返回
std::vector
。没有解决方案吗?

您可以使用具有迭代器范围的构造函数重载:

vector<myStruct> svec(ivec.begin(), ivec.end());
向量svec(ivec.begin(),ivec.end()); 您可以使用
向量svec(ivec.begin(),ivec.end())取而代之


您还可以使用std::copy(ivec.begin()、ivec.end()、std::back_inserter(svec))
svec.assign(ivec.begin(),ivec.end())
如果您多次分配可能会更好,因为它可以在清除
向量后重新使用该向量的容量。

您的最佳选择是具有转换功能

std::vector< myStruct> convertVector( const std::vector< int> & other)
{
    return std::vector< myStruct> ( ivec.begin(), ivec.end() );
}

无论如何,我不鼓励这样做^^

您可以使用
向量svec(ivec.begin(),ivec.end())取而代之。@Rostislav:作为回答,我在你几秒钟后提交了同样的东西。@Blastfull谢谢:)我还添加了一些更多的信息。谢谢我相信这会起作用,但想象一下,在这种情况下,我想编写一个库,并希望在库中处理它,这样用户就可以编写
std::vector svec=someFunction()
,其中someFunction返回
std::vector
。有什么解决办法吗?@Sinapse:我不认为这是可能的,但是一个比我大脑更大的人可能会给出一个明确的答案。谢谢,如果我没有找到好的答案,我会告诉用户像这样获取向量;)@因为你不能在不同参数类型的向量之间赋值。我想没有办法了,我会选择你的答案,因为它有更多的信息;)
std::vector< myStruct> convertVector( const std::vector< int> & other)
{
    return std::vector< myStruct> ( ivec.begin(), ivec.end() );
}
class IntVector: public std::vector<int>{
    public:
    //conversion operator (note a VERY BAD IDEA using this, may come in handy in few cases)
    operator myStructVector () { 
        return convertVector(*this); 
    }
}

class myStructVector: public std::vector< myStruct>{
    //....
};
int main()
{
    IntVector ivec;
    ivec.push_back(1);
    myStructVector svec = (myStructVector)ivec;

    return 0;
}