18

这是在 C# 中提出的相同问题,但我需要 C++

如何将数组的一部分复制到另一个数组?

考虑我有

    int[] a = {1,2,3,4,5};

现在,如果我给出数组 a 的起始索引和结束索引,它应该被复制到另一个数组。

就像我将起始索引设为 1 并将结束索引设为 3 一样,元素 2、3、4 应该被复制到新数组中。

在 C# 中,它按以下方式完成

     int[] b = new int[3];
    Array.Copy(a, 1, b, 0, 3);

有没有像这样的简单方法在 C++ 中完成相同的任务?

4

6 回答 6

20

是的,使用std::copy

std::copy(a + src_begin_index,
          a + src_begin_index + elements_to_copy,
          b + dest_begin_index);

您的 C# 示例的等价物是:

std::copy(a + 1, a + 4, b);
于 2012-06-19T13:34:02.737 回答
5

假设您想要像 C# 示例中那样动态分配的数组,最简单的方法是:

std::vector<int> b(a.begin() + 1, a.begin() + 4);

这还有一个好处是它会在销毁时自动释放分配的内存;如果您new自己使用,那么您还需要使用delete以避免内存泄漏。

于 2012-06-19T13:48:51.420 回答
1

C memcpy命令,您可以像这样使用它:

memcpy(destinationArray, sourceArray, sizeof(*destinationArray) * elementsToCopy);

还有std::copy,这是一种更多C++的方法:

std::copy(source, source + elementsInSource, destination);

请注意,这些函数都不会检查以确保已分配足够的内存,因此使用风险自负!

于 2012-06-19T13:34:35.440 回答
1

是的,使用 st 标准库算法copy

#include <algorithm>

int main()
{
  int array[5] = { 1,2,3,4,5 }; // note: no int[] array
  int *b = new int[3];
  std::copy(array+1, array+4, b); 
  // copies elements 1 (inclusive) to 4 (exclusive), ie. values 2,3,4
}
于 2012-06-19T13:34:47.327 回答
0

对于简单的 C 样式数组,您可以使用memcpy

memcpy(b, &a[1], sizeof(int) * 3);

此行从 的索引 1 复制sizeof(int) * 3字节(即 12 个字节)a,并将b其作为目标。

于 2012-06-19T13:34:20.783 回答
0

如果您在 CPP 中使用矢量,您可以这样做 -

假设您想将arr中的元素从索引A复制到索引B,您可以这样做 -

vector<int>nums(arr.begin()+A, arr.begin()+B+1);

注意 - nums 将被创建为 A[start, end) 所以我们需要添加额外的 1

于 2022-01-19T23:11:59.703 回答