1

我正在尝试拆分数组,这就是我的做法:

int arr1[] = {1, 2, 3, 4, 5};
int *arr2 = arr1 + 1;

现在我需要循环执行此操作。在每次迭代中,我都试图根据条件将数组的大小减少 1 个元素或 2 个元素。由于显而易见的原因,我无法声明int arr2[some_variable].

但我希望在循环的每次迭代中创建一个新数组,其大小比其父数组小 1。我不确定如何实现这一目标。有人可以帮忙吗?

在 Java 中,有一个函数可以做到这一点:int newArr[] = Arrays.copyOfRange(arr, 1, arr.length);我想要在 C++ 中类似的东西。

4

3 回答 3

5

std::vector<int>从 C++ 标准库中使用:

#include <string>
#include <iostream>
#include <vector>

void dump(std::vector<int> &v)
{
    for (std::vector<int>::iterator it = v.begin(); it != v.end(); it++)
        std::cout << *it << " ";
}

int main()
{
    int a[] = { 1, 2, 3, 4, 5 };
    std::vector<int> v(a, a + 5);
    std::vector<int> v2(v.begin() + 1, v.begin() + 4);

    dump(v);
    std::cout << std::endl;
    dump(v2);
}

如果你真的 - 真的 - 真的不能使用vector(为什么,认真?),那么就memcpy.

int arr[] = { 1, 2, 3, 4, 5 };
int cp[3];
memcpy(cp, arr + 1, sizeof(cp));
于 2013-06-26T20:27:56.570 回答
2

我不确定您为什么每次都想要一个新的,但是您可以使用标准容器,例如std::vector

std::vector<int> arr1{1, 2, 3, 4, 5}; //std::iota is another option
int index{};
/*loop header*/ {
    //make sure arr1.size() is at least 1
    std::vector<int> arr2(std::next(std::begin(arr1), ++index), std::end(arr1));
}

我使用std::next它是因为它适用于更多场景。所有这一切都是从两个迭代器创建一个向量:必要时越过开头,越过结尾(过去是因为它是排他的)。

尽管 C++11 很好,但它并不总是成为现实。在这种情况下,这应该有效:

int arr1temp[] = {1, 2, 3, 4, 5};
std::vector<int> arr1(arr1temp, arr1temp + sizeof(arr1temp)/sizeof(arr1temp[0]));

int index = 0;
/*loop header*/ {
    //make sure arr1.size() is at least 1
    std::vector<int>::iterator start = arr1.begin();
    std::advance(start, ++index); 
    std::vector<int> arr2(start, arr1.end());
}
于 2013-06-26T20:29:38.140 回答
0

/为什么/你认为你需要复制数组吗?指针和数组在某种程度上是可以互换的,所以您需要做的就是跟踪大小并对其进行修改。

void doSomethingWithArray(int* array, size_t arraySize) {
    ....
}

const size_t arraySize = 5;
int arry1[arraySize] = { 1, 2, 3, 4, 5 };
int* array = arr1;
int* arrayEnd = arr1 + arraySize;
for (int i = 0; i < 10; ++i) {
  if ((*array) & 1 == 1) {
    array += 1;
  } else {
    array += 3;
  }
  if(array >= arrayEnd)
      break;
  size_t howBigIsMySlice = arrayEnd - array;
  if(howBigIsMySlice > && (rand() % 1) == 0)
    howBigIsMySlice -= 1;
  doSomethingWithArray(array, howBigIsMySlice);
}

您没有复制数据,就“doSomethingWithMyArray”而言,数组与我们所说的一样大。

于 2013-06-26T22:09:36.307 回答