让我稍微充实一下你的问题。你提到:
我问是因为我想从函数返回一个数组 [...] 但我想在事先不知道大小的情况下构建数组。大小将作为参数传递。我想知道是否有办法在不使用动态分配的情况下做到这一点。
对于我想从作为参数传递的函数 [...] 大小返回一个数组,对我来说,您可以在任何地方使用似乎是合理的,并在您需要访问底层数组时std::vector
调用它的方法(保证.data()
是连续的)。例如:
std:vector<double> myfun(size_t N) {
std::vector<double> r(N);
// fill r[0], r[1], ..., r[N-1]
return r;
}
// later on:
r.data(); // gives you a pointer to the underlying double[N]
对于我想在没有动态分配的情况下执行此操作,除非您在编译时知道大小,否则这是不可能的。如果是这种情况,那么就像以前一样做,但使用std::array
,它可以根据已知的编译时大小实现优化:
std::array<double, N> myfun() {
std::array<double, N> r;
// fill r[0], r[1], ..., r[N-1]
return r;
}
// later on:
r.data(); // gives you a pointer to the underlying double[N]
为了通用,我实际上会使用一个能够处理任意容器的模板函数:
template<typename T>
void myfun(T& data) {
for(int k=0; k<data.size(); k++) {
// do stuff to data[k]
}
}
// call as, for example:
std::vector<double> data(10);
myfun(data);
// or equally valid:
std::array<double, 10> data;
myfun(data);
最后,如果您使用的是二维数据,请记住,当您以行优先顺序存储矩阵时:
Matrix [1, 2; 3 4] is stored as [1 2 3 4]
(i, j)
然后你可以通过调用来引用矩阵的元素data[i * ncols + j]
。例如:考虑一个三乘四矩阵:
a b c d
e f g h
i j k l
元素(2, 2)
(即:第三行,第三列,因为我们假设从零开始的 C 类型索引)计算为:M[2][2] = M[2 * 4 + 2] = M[10] = k
。之所以如此,是因为它被存储为:
[a b c d e f g h i j k l]
[0 1 2 3 4 5 6 7 8 9 10 11]
并且k
是具有索引的元素10
。