从数组中提取对数

时间:2018-04-24 12:52:19

标签: c++ arrays pointers

晚上好,伙计们。

我目前在从阵列中提取配对号时遇到了困难。我有以下代码:

#include <iostream>

using namespace std;

int *paire(int *d, int length) {
    int counter = 0;
    int position = 0;
    for (int i=0; i<length; i++) {
        if (d[i] % 2 ==0)
            counter++;
    }

    int *k = new int[counter];
    for (int i=0; i<length; i++) {
        if (d[i] % 2 ==0) {
            k[position] = d[i];
            position++;
        }
    }
    return k;
}

int main() {
    int b[8] = {1,2,3,4,5,6,7,8};
    int *array1 = paire(b,8);
    for (int i=0; i<5; i++) { // how can I point here to the counter in paire() ?
        cout<<array1[i];
    }
   delete[] array1;
    return 0;
}

所以我认为我在函数paire中初始化新数组时已经做对了,但是我很难遍历数组。

P.S。我是大学的第一年,所以如果你能在答案中保持同样的简洁,我真的很感激。提前谢谢!

2 个答案:

答案 0 :(得分:2)

您似乎需要返回2个单独的值:数组b中的偶数个数,以及仅存储偶数的新分配内存的地址。

由于您无法返回多个变量,因此对您的代码进行最小修改的解决方案如下:

int *paire(int *d, int length, int& counter) {
    counter = 0;

    // rest of your function remains unchanged
    // ...
}

int main() {
    int b[8] = {1,2,3,4,5,6,7,8};
    int evenNumbers;
    int *array1 = paire(b,8, evenNumbers);
    for (int i=0; i<evenNumbers; i++) {
        cout<<array1[i];
    }
    delete [] array1;
    return 0;
}

或者,您可以返回counter中的值,并将int*变量的引用作为paire函数的参数发送。或者,您可以声明paire具有返回类型void,并使用对传回两个值的引用。

答案 1 :(得分:0)

您可以通过分配length并通过输出参数返回counter来进一步简化您的功能。

#include <iostream>

using namespace std;

int *paire(int *d, int length, int &counter) {
    counter = 0;
    int *k = new int[length]; // allocate for the maximum memory
    for (int i = 0; i < length; ++i) {
        if (d[i] % 2 == 0) {
            k[counter++] = d[i];
        }
    }
    return k;
}

int main() {
    int b[8] = {1,2,3,4,5,6,7,8};
    int counter = 0;
    int *array1 = paire(b,8, counter);
    for (int i=0; i<counter; i++) { // how can I point here to the counter in paire() ?
        cout<<array1[i] << " ";
    }
    delete [] array1;
    return 0;
}

但请注意,正如其他人已经指出的那样,这种方法很容易出错,因为它让客户端有责任删除paire函数使用的内部存储器。