1

我认为这是一个简单的问题,但它让我发疯:我想从一个方法返回多个数组,调用方法事先不知道它们的大小。所以我必须在方法中创建这些数组(而不是仅仅填充它们)并且我无法使用return.

所以我想要的是这样的方法签名:

void giveMeArray(int[] *anArray)

方法签名只有一个参数来简化示例,请假设我也可以有一个签名

void giveMeArrays(int[] *anArray, float[] *anotherArray)

在该方法中,giveMeArray我将构造数组

*anArray = new int[5];

我会使用该方法调用该方法

int[] result;
giveMeArray(&result);

然而,所有这些(从方法签名开始)至少在语法上是错误的。请原谅我现在手头没有编译器错误,我很确定你们中的一些人会知道出了什么问题。

编辑知道std::vector 将是最好的(意思是最干净的)方法。然而,伙计们,这不是问题所在。

4

4 回答 4

5

返回一个vector(毕竟这是 C++)

void giveMeArray(std::vector<int>& anArray)
{
   anArray = std::vecotr<int>(5);
}

返回一个向量的向量:

void giveMeArray(std::vector<std::vector<int> >& anArray)
于 2012-08-21T22:21:44.517 回答
2
void giveMeArray(int **anArray);

int *result;
giveMeArray(&result);
于 2012-08-21T22:25:38.253 回答
2
std::vector<int> giveMeArray() {
    std::vector<int> ret;
    ret.resize(5);
    return ret;
}

不错的资源清理,调试模式中的边界检查等。对所有家庭都有好处。

于 2012-08-21T22:44:26.070 回答
0

考虑将数组包装在类或结构中。

struct Arrays {
    int *ints;
    int intCount;
    double *doubles;
    int doubleCount;
};

Arrays giveMeArrays() {
    Arrays arrays;
    arrays.ints = new int[10];
    arrays.intCount = 10;
    arrays.doubles = new double[20];
    arrays.doubleCount = 20;
    return arrays;
}

另一种方法是使用 astd::pair<>或 a std::tuple<>,但根据我的经验,对它们的任何使用最终都会成为命名类型。它们都是函数结果的一部分这一事实表明它们可能具有足够的连贯性成为对象。拥有用户定义的类型可以更容易地传递数据,从而更容易重构代码。你甚至会发现它giveMeArrays()变成了这个对象的一个​​成员函数。

如果可能的话,替换ints/会更好。如果没有,您可能希望让 Arrays 更多地负责内存管理、在允许移动的同时禁用复制等等。intCountstd::vector<int>

于 2012-08-22T16:28:20.347 回答