【问题标题】:C++ assign array of ints to an empty array of ints same sizeC ++将整数数组分配给相同大小的空整数数组
【发布时间】:2012-01-19 17:31:59
【问题描述】:

我非常熟悉 Java,这是允许的。但是它看起来不像C++。我在尝试分配 valuesToGrab = updatesValues; 时收到“无效的数组分配”。

//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
}

我不想遍历updateValues并将其一一添加到valuesToGrab,但如果我必须这样做的话。有没有办法可以用 C++ 在一个函数中分配它?

谢谢,

【问题讨论】:

  • 对于 C 样式数组 memcpymemmove
  • “修剪”数组似乎完全没有必要。修剪然后复制,双重如此。
  • 你真的,真的应该学习 C & C++ 中的内存管理。
  • 另外,你的评论“//现在我想将它分配给 valuesToGrab(另一个程序将 //不断地抓取这个数组,并且它在上面填充时无法抓取它或会有问题”强烈暗示需要通过互斥锁或关键部分进行进程同步。
  • 谢谢你们。我同意修剪是不必要的,我知道有时我必须研究使用 C++ 进行线程化。我还听说内存管理在 C++ 中非常重要,所以我也会研究一下。

标签: c++ arrays variable-assignment


【解决方案1】:

在 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

I 向量完成数组所做的一切(包括 C++11 中的静态初始化),但具有良好定义的接口。带有迭代器、大小、空、调整大小、push_back 等。

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

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

编辑 还值得注意的是,您可以将向量和数组结合起来。

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.

【讨论】:

    【解决方案2】:

    在 C++ 中,用来代替数组的惯用容器是 std::vector。对于vector 或数组,您可以使用&lt;algorithm&gt; 标头中的std::copy() 函数,这是在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 风格,可以使用 C 标准库函数 memcpy(),来自 &lt;cstdlib&gt;

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

    对于memcpy()(及其表亲memmove()),您必须注意要复制的元素的大小;如果你说 361 而不是 361 * sizeof(int),你将复制 361 个字节,而不是 ints 的 361 个字节——这是一个很大的不同。

    【讨论】:

    • 您应该澄清memcpy 仅在您想从一个数组复制到另一个数组时适用(尽管如果您可以使用它在 POD 向量之间复制获取指向相关元素的指针)。
    • 好的,+1 :)(也为了平衡恕我直言不合理的 -1)
    • 您可以使用 vector::assign 代替复制。它会为你分配空间。
    【解决方案3】:

    请记住,数组在 C 和 C++ 中被实现为指针。

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

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

    【讨论】:

    • 数组不是指针。数组的名称可以转换为表达式中的指针。
    【解决方案4】:

    首先,我认为这不会满足您的要求,因为valuesToGrab = updatingValues; 会在外循环的每个循环中覆盖您的valuesToGrab

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

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

    会做的。您可以将普通数组视为任何 std:: 算法中的 std:: 容器,指针计为随机访问迭代器。

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

    【讨论】:

    • 这就是我想做的。我只希望 valuesToGrab 进行最新的完整扫描。如果我没有这个数组,而是有一个获取更新值的方法,那么它可能会在重新填充时得到它并返回一个半满的数组。你是对的修剪。我想我可以忽略这一点。谢谢。
    猜你喜欢
    • 2021-07-04
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多