如何简单地分配不同结构的向量?
Posted
技术标签:
【中文标题】如何简单地分配不同结构的向量?【英文标题】:How to simple assign vectors of different structs? 【发布时间】:2015-06-13 19:48:21 【问题描述】:所以我有两个不同的结构 (a & b),它们具有相同的变量,并且结构 b 中有一个重载的 = 运算符将 a 转换为 b。
我希望能够简单地将a的向量分配给向量b,但是编译器给了我一个错误:
main.cpp|61|error C2679: binary '=' : no operator found which takes a right-hand operand of type 'std::vector<_Ty>' (or there is no acceptable conversion)|
我假设我已经有重载的 = 运算符,并且它会简单地迭代向量 a 并为每个实例使用那个 = 运算符。我该怎么做?
代码如下:
#include <iostream>
#include <vector>
using namespace std;
struct a
int x, y;
a()
a(int _x, int _y)
x = _x;
y = _y;
;
struct b
int x, y;
b()
b(int _x, int _y)
x = _x;
y = _y;
b& operator=(const a& _a)
x = _a.x;
y = _a.y;
return *this;
;
int main()
a a_test(1,2);
std::vector<a> a_vec;
std::vector<b> b_vec;
for(int i = 0; i <10; i++)
a_vec.push_back(a_test);
/*
for(int i = 0; i<a_vec.size(); i++)
b_vec.push_back(a_vec[i]);
*/
b_vec = a_vec;
return 0;
【问题讨论】:
std::copy
应该可以工作。您必须手动迭代向量。
这永远行不通,std::vector
做不到。您必须手动复制。
【参考方案1】:
问题在于您的operator=
仅适用于单个元素,而不适用于整个向量。
您需要定义一个构造函数,将A
转换为B
。
那么你可以使用std::vector::assign 而不是std::vector::operator=。
#include <iostream>
#include <vector>
using namespace std;
struct A
int x, y;
A(): x(0), y(0)
A(int x, int y): x(x), y(y)
;
struct B
int x, y;
B(): x(0), y(0)
B(int x, int y): x(x), y(y)
// need to construct B from A
B(const A& a): x(a.x), y(a.y)
B& operator=(const A& a)
x = a.x;
y = a.y;
return *this;
;
int main()
A a_test(1,2);
std::vector<A> a_vec;
std::vector<B> b_vec;
for(int i = 0; i <10; i++)
a_vec.push_back(a_test);
// b_vec = a_vec; // not like this
b_vec.assign(a_vec.begin(), a_vec.end()); // like this
return 0;
注意:我更改了您的一些名称,因为 C++
标准规定我们不应该以下划线“_”开头的变量名。
【讨论】:
【参考方案2】:即使a
和b
看起来相同,编译器仍将它们视为不同的类型,即使a
可以转换为b
(反之亦然)。因此,vector<a>
和 vector<b>
是完全不相关的,因此不能将一个分配给另一个,整个分配无法编译。
你可以使用std::copy
这样的算法,
std::copy(a_vec.begin(), a_vec.end(), std::back_inserter(b_vec));
【讨论】:
以上是关于如何简单地分配不同结构的向量?的主要内容,如果未能解决你的问题,请参考以下文章