C ++将int数组分配给一个相同大小的空数组

时间:2011-12-13 20:56:27

标签: c++ arrays variable-assignment

我非常熟悉Java,这是允许的。然而,看起来它不适用于C ++。我在尝试分配valuesToGrab = updatingValues;时收到“无效的数组赋值”。

//these are class attributes
int updatingValues[361] = {0};
int valuesToGrab[361] = {0};

//this is part of a function that is causing an error. 
for (unsigned int i=0; i < 10; i++) {

    //this fills values with 361 ints, and num_values gets set to 361. 
    sick_lms.GetSickScan(values,num_values);

    //values has 361 ints, but a size of 2882, so I copy all the ints to an array
    //of size 361 to "trim" the array.
    for(int z = 0; z < num_values; z++){
        updatingValues[z] = values[z];
    }

    //now I want to assign it to valuesToGrab (another program will be 
    //constantly grabbing this array, and it can't grab it while it's being
    //populated above or there will be issues
    valuesToGrab = updatingValues; // THROWING ERROR
}

我不想迭代更新值并将其逐个添加到valuesToGrab中,但如果我必须这样做。有没有办法可以用C ++在一个函数中分配它?

谢谢,

4 个答案:

答案 0 :(得分:6)

C ++中复制的标准习惯是

#include <algorithm>
...
std::copy(values, values+num_values, updatingValues);

确保updatingValues足够大或者你会超支,并且会发生不好的事情。

那就是说在C ++中我们通常使用std :: vector来完成这类任务。

#include <vector>
...
std::vector<int> updatingValues=values; //calls vectors copy constructor

我向量执行数组所做的一切(包括C ++ 11中的静态初始化),但是有一个很好的定义接口。 with iterators,size,empty,resize,push_back等。

http://en.cppreference.com/w/cpp/algorithm/copy

http://en.cppreference.com/w/cpp/container/vector

EDIT 值得注意的是,您可以组合矢量和数组。

std::vector<int> vect(my_array, my_array+10);
//or
std::vector<int> another_vector;
...
another_vector.assign(my_array, my_array+10);//delayed population

,反之亦然

std::copy(vect.begin(), vect.end(), my_array); //copy vector into array.

答案 1 :(得分:2)

在C ++中,用于代替数组的惯用容器是std::vector。使用vector或使用数组,您可以使用std::copy()标头中的<algorithm>函数,这是在C ++中复制任何类型容器的首选方法。使用vector

std::vector<int> updatingValues, valuesToGrab;

// Ensure the vector has sufficient capacity to accept values.
updatingValues.resize(361);

// Copy values from the array into the vector.
std::copy(values, values + 361, updatingValues.begin());
//        Source begin & end;   Destination begin.

// Copy one vector to another.
valuesToGrab = updatingValues;

使用数组:

std::copy(valuesToGrab, valuesToGrab + 361, updatingValues);

再次使用数组,如果您想要更多C风格,可以使用memcpy()中的C标准库函数<cstdlib>

memcpy(valuesToGrab, updatingValues, 361 * sizeof(int));
//     Destination;  Source;         Number of bytes.

使用memcpy()(及其表兄,memmove()),您必须注意要复制的元素的大小;如果你说361而不是361 * sizeof(int),你将复制361个字节,而不是361个int s'的字节 - 这是一个很大的区别。

答案 2 :(得分:2)

首先,我不认为这会做你正在寻找的东西,因为valuesToGrab = updatingValues;会覆盖外循环的每个循环valuesToGrab

假设您确实想要这样做,并且您不想更改为向量:

std::copy(updatingValues, updatingValues+361, valuesToGrab);

会做到的。您可以像任何std :: algorithm中的std :: container一样处理普通数组,指针计为随机访问迭代器。

重新考虑你的设计,你不应该“修剪”,你可能不需要复制。

答案 3 :(得分:-1)

请记住,数组是用C和C ++中的指针实现的。

特别是堆栈上的数组可以显示为指向内存中具有您为数组请求的容量的常量位置的指针。这个内存在堆栈中。当您尝试valuesToGrab = updatingValues时,您可以将此视为尝试将updatingValues的地址复制到变量valuesToGrab。这是尝试深层复制,您似乎正在尝试。但是,valuesToGrab指向内存中的常量位置,无法更新。该标准稍微具体一点,并明确禁止数组的分配,这就是为什么你得到你所看到的特定错误。

您需要使用循环或类似std::copy或C memcpy的内容来将值从一个数组复制到另一个数组。