STL矢量之间的自动转换

automatic conversion between stl vectors

本文关键字:转换 之间 STL      更新时间:2023-10-16

我想要的是将std::vector<int>复制到另一个std::vector<myStruct>,其中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<myStruct>std::vector<int>之间的有效转换,尽管int可以隐式地转换为myStruct。另一方面,赋值操作符不能在类之外声明,所以我推断手动编写操作符不是一种选择。那么在这种情况下我该怎么做呢?

* * *更新:正如Blastfurnace和其他人所说,可以使用以下代码来解决这个问题,而不是赋值:

vector<myStruct> svec(ivec.begin(), ivec.end());

但是想象一下这样的情况,我想写一个库,并想在库本身处理这个问题,这样用户就可以只写std::vector<myStruct> svec = someFunction(),其中someFunction返回std::vector<int>。没有解决办法吗?

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

vector<myStruct> svec(ivec.begin(), ivec.end());

您可以使用vector<myStruct> svec(ivec.begin(), ivec.end());代替。

您也可以使用std::copy(ivec.begin(), ivec.end(), std::back_inserter(svec));svec.assign(ivec.begin(), ivec.end());,因为如果您分配多次,它可能会更好,因为它可以在清除vector<myStruct>后重用其容量。

你最好有一个转换函数

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

无论如何我都不赞成这样做^^