如何复制结构属性并更改副本而不更改原始副本

时间:2018-07-15 19:06:57

标签: c++ struct

假设此结构

typedef struct solution {
    int *vector;
    float cost;   
}solution;

如何将其传递给函数以副本而不是原始形式进行操作?示例:

solution change(solution c){
    solution d;
    d.vector = c.vector;
    d.vector[1]++;
    return d;
}

int main(){
    int a[3] = {1,2,3};
    solution c;
    c->vector = a;
    solution d = change(c);

    printf("%d %d\n",c.vector[1],d.vector[1]);
}

我希望打印3 2

很抱歉提出这样一个基本问题,但是根据我在类似问题中的搜索结果,建议使用memcpy,但与上面的代码相同。

2 个答案:

答案 0 :(得分:1)

您的问题基本上是您在使用原始指针:没有。请改用std::vector

#include <vector>

struct solution { // No need for typedef - C++ does that automatically.
    std::vector<int> vec;
    float cost = 0.0f;     // Always good to initialize
};

solution change(const solution& c) { // By default, pass 'big' objects by const reference 
    solution d;
    d.vec = c.vec; // This will allocate a new vector and copy the value.
    d.vec[1]++;
    return d;
}

int main(){
    const int a[3] = {1,2,3};
    solution c;
    std::copy( std::begin(a), std::end(a), std::back_inserter(c.vec));
    const solution d = change(c);

    printf("%d %d\n",c.vec[1],d.vec[1]);
}

答案 1 :(得分:1)

solution csolution d都持有一个指向同一存储位置的指针,即int a [3]的地址。我认为您不了解的是d.vector = c.vector,它实际上并不只是复制指向该数组的指针,所以c和d实际上指向同一数组,因此当您尝试打印它时,您将获得相同的值。您可能想看一下malloc(如果使用的是c ++,则可能是new),并试图更好地理解指针。