c ++数组的动态大小

时间:2010-11-02 10:12:41

标签: c++ arrays dynamic

我在c ++中遇到了1D数组的小问题。我有一个功能线:

void func(int (&array)[???])
{
    // some math here;

    "for" loop {
        array[i] = something;
    }
}

我在代码中的某处调用函数,在进行数学运算之前,我无法知道数组的维数。该数组作为引用转到函数!,因为我需要在main()函数中使用它。我怎么能像这样分配数组?所以数组有??维度转到函数作为引用然后我必须放置维度并写入一些值。

6 个答案:

答案 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]
    }
}