如何简单地分配不同结构的向量?

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】:

即使ab 看起来相同,编译器仍将它们视为不同的类型,即使a 可以转换为b(反之亦然)。因此,vector&lt;a&gt;vector&lt;b&gt; 是完全不相关的,因此不能将一个分配给另一个,整个分配无法编译。

你可以使用std::copy这样的算法,

std::copy(a_vec.begin(), a_vec.end(), std::back_inserter(b_vec));

【讨论】:

以上是关于如何简单地分配不同结构的向量?的主要内容,如果未能解决你的问题,请参考以下文章

[您有新的未分配科技点]计算几何入门:点,向量以及向量的简单应用

Mandelbrot的每个像素计算如何划分到不同的节点?

不能将结构分配给向量的索引吗? [关闭]

声明结构时的向量分配

具有 const 成员的结构向量

将内存分配给结构向量的指针时出现 SEG FAULT