我在c ++中遇到了1D数组的小问题。我有一个功能线:
void func(int (&array)[???])
{
// some math here;
"for" loop {
array[i] = something;
}
}
我在代码中的某处调用函数,在进行数学运算之前,我无法知道数组的维数。该数组作为引用转到函数!,因为我需要在main()函数中使用它。我怎么能像这样分配数组?所以数组有??维度转到函数作为引用然后我必须放置维度并写入一些值。
答案 0 :(得分:14)
由于您使用的是C ++,为什么不使用std::vector<>
?
答案 1 :(得分:10)
其他人提到你应该在C ++中使用std::vector
,他们是对的。
但是,您可以通过将func
设置为函数模板来使代码正常工作。
template <typename T, size_t N>
void func(T (&array)[N])
{
// some math here;
"for" loop {
array[i] = something;
}
}
答案 2 :(得分:9)
使用指针,而不是参考:
void func(int *a, int N);
或者,更容易,使用矢量:
void func(std::vector<int> &a);
可以通过简单地说
来分配向量std::vector<int> a(10);
可以使用a.size()
检索元素数量。
答案 3 :(得分:5)
如果传递给func
的数组是堆栈数组而不是指针,则可以使用函数模板保留其大小:
template <class T, size_t N>
void func(T(&array)[N])
{
size_t array_length = N; // or just use N directly
}
int main()
{
int array[4];
func(array);
}
如上所述,正如其他人已经指出的那样,std::vector
可能是最好的解决方案。
答案 4 :(得分:0)
除了已被建议的向量之外,您还可以使用valarray,它也是STL的一部分,专门用于处理数学集合。
答案 5 :(得分:0)
你必须意识到,数组是指针。像int array[5]
这样的定义将为堆栈上的5个整数分配空间,array
将是第一个值的地址。因此,要访问数组中的第一个值,可以编写
array[0]
或*array
(与*(array + 0)
相同)
以同样的方式检索第三个元素的地址,你可以写
&array[2]
或array + 2
由于数组是指针,如果要将数组传递给函数,则不必担心数组的运行时大小,只需将其作为指针传递:
void func(int *array)
{
int size;
//compute size of the array
for (int i = 0; i < size; ++i)
{
//do whatever you want with array[i]
}
}