在C ++中复制值与结构成员之间的值

时间:2013-05-19 14:27:02

标签: c++ structure memcpy

我有一个如下所示的结构,我用它来分类矢量,同时跟踪索引。

struct val_order{
        int order;
        double value;
};

(1)。目前我所做的是使用循环来复制值,如下所示。所以我的第一个问题是,是否有更快的方法将值复制到结构的成员(而不是将整个结构复制到另一个结构)

int n=x.size();
std::vector<val_order> index(n);
for(int i=0;i<x.size();i++){        //<------So using a loop to copy values.
    index[i].value=x[i]; 
    index[i].order=i;
}

(2)。我的第二个问题与将结构的一个成员复制到数组有关。我找到了post here,讨论了使用memcpy来实现这一目标。但我无法使其工作(下面的代码)。我收到的错误消息是class std::vector<val_order, std::allocator<val_order> > has no member named ‘order’。但我能够通过迭代来访问index.order中的值。所以我想知道我的代码有什么问题。

int *buf=malloc(sizeof(index[0].order)*n);
int *output=buf;
memcpy(output, index.order, sizeof(index.order));

1 个答案:

答案 0 :(得分:1)

问题1

由于您是从两个不同的源(数组 x 和变量 i )初始化n个向量,因此很难避免循环。 (如果您的index.assign数组已经填充了值,则可以从val_order初始化向量,请参阅this link

问题2

您希望将所有n 订单值复制到 int 数组中, memcpy 似乎很方便。不幸的是,

  • 向量的每个元素都是val_order结构,所以即使您可以通过 memcpy 进行复制,这不仅会复制 int * order *值还有 double * value * value
  • 此外,您正在处理 vector ,其内部结构不是一个简单的数组( vector 允许使用常规数组无法进行的操作),因此您不能通过简单地将第一个向量元素的地址提供给 memcpy ,将一堆 vector 复制到 int 数组。
  • 另外, memcpy 无论如何都不会像你想要的那样工作,但是它需要一个地址 - 因此你必须给出,例如,&index[0] ......但是,这是鉴于以上几点,不是你想要的

所以你必须改为做另一个循环,比如

int *buf = (int *)malloc(sizeof(int)*n);
int *output = buf;
for (int i=0 ; i<n ; i++) {
   output[i] = index[i].order;
}