【问题标题】:C++ concatenate two arrays without deep copyingC ++连接两个数组而不进行深度复制
【发布时间】:2020-08-14 07:44:21
【问题描述】:

我有两个每个大小为 3 的数组:

void main() {
    double* arr1 = new double[3];
    double* arr2 = new double[3];
    for(int i = 0; i < 3; i++) {
        arr1[i] = 0;
        arr2[i] = 0;
    }
}

我有一个函数,它以双精度数组为指针:

void func(double* arr_6D) {
   // expected arr size = 6.
   // manipulates values of arr
   for(int i = 0; i < 6; i++) {
      arr_6D[i] = 1;
   }
}

我想将 arr1 和 arr2 一起传递给函数,以便函数操纵它们的 原始 值。

我该怎么做?

下面不起作用,因为它正在复制原始数组:

double *arr_merged = new double[6];
arr_merged[0] = arr1[0];
arr_merged[1] = arr1[1];
arr_merged[2] = arr1[2];
arr_merged[3] = arr2[0];
arr_merged[4] = arr2[1];
arr_merged[5] = arr2[2];
func(arr_merged);

【问题讨论】:

  • 为什么不使用std::vector&lt;double&gt; 来更改大小,例如添加新值并进行合并?
  • 通过引用传递数组并通过引用将它们分配给新数组
  • 你做不到。如果您可以更改 func 签名以接受您的自定义类型,则可以编写带有重载 operator[]struct { double* first, double* second }; 以在不复制的情况下访问两个数组的元素。
  • @bruno 我没有写一些细节,但 'func(double * arr_6D) 来自库并已修复。我无法将其更改为例如 func(std::vector &arr_6d)
  • @d4rk4ng31 你能举个例子吗?

标签: c++ arrays double


【解决方案1】:

您无法修改使用 new double[&lt;size&gt;] 创建的数组的大小,以便能够进行合并,因此修改大小使用 std::vector&lt;float&gt;,还提供了许多其他行为

'func(double * arr_6D) 来自库并已修复。我无法将其更改为例如 func(std::vector &arr_6d)

您可以使用操作data() 获取底层数组作为元素存储

std::vector<double> arr1 = { ... }
...
std::vector<double> arr2 = { ... }
...
// concatenate arr1 with arr2
arr1.insert( arr1.end(), arr2.begin(), arr2.end() );
...
// call your func with underlying array
func(arr1.data());

警告在操作底层数组时要小心

【讨论】:

    猜你喜欢
    • 2021-01-23
    • 2018-10-08
    • 1970-01-01
    • 2022-01-20
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多