STL矢量之间的自动转换
automatic conversion between stl vectors
我想要的是将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;
}
无论如何我都不赞成这样做^^
- 构造函数和转换运算符之间的重载解析
- C ++中无符号位长度类型之间的隐式转换,即uint8_t,uint16_t
- 模板转换运算符在 clang 6 和 clang 7 之间的区别
- 派生类(构造函数具有参数)和基类(构造函数缺少参数)之间没有可行的转换
- Cxx.jl 在 Julia Complex 和 std::complex 之间进行转换
- 如何在 std::string 和 Aws::String 之间进行转换?
- 转换字符时Arduino DUE 和 Arduino UNO 之间的区别
- 如何使用静态多态性在 int 和指针类型之间进行转换?
- 指向 POD 类型的指针之间的静态转换与重新解释转换
- 在 Rcpp 中的字符串类型之间转换时出错
- 如何声明不同类型的模板化类之间的转换
- C 和 C++ 中的函数指针转换之间的差异
- 与浮点转换之间的规范化整数
- 重新解释强制转换和 C 样式转换之间的 C++ 区别
- C++ get 和类型转换之间的用法有什么区别?我应该使用哪一个?
- printf函数参数之间的序列点;转换之间的顺序点是否重要
- Clang和GCC中不明确基类转换之间的行为差异
- 转换之间的双和字节数组,为传输ZigBee API
- 隐式转换和显式转换之间的区别
- interpret_cast和C样式强制转换之间的区别是什么