获取未知数组长度的最简单方法是什么?

时间:2013-07-13 11:35:06

标签: c++

我有一个函数可以对数组进行一些计算,但它必须知道数组的大小。我怎么能得到它,如果我的函数只有数组本身,没有大小?

是否可以在多维数组上执行此操作?

6 个答案:

答案 0 :(得分:7)

一种方法是使用模板:

template <size_t N>
void foo(int (&array)[N]) {
    ⋮
}

int main() {
    int array[] = {5, 4, 3, 2, 1};
    foo(array);
}

请注意,这仅在调用者在编译时知道数组的大小时才有效。

答案 1 :(得分:4)

您的问题标记为“C ++”,因此第一条规则是:

  1. Arrays are evil!如果可能,请不要使用数组。请改用std::vector(或其他容器)。

    void Foo(const std::vector<int>& v)
    {
         size_t size = v.size();
    
    }
    

    但是,如果 reeeeealy 必须使用数组:

  2. 如果您的数组在堆栈上分配并作为数组变量传递:您可以使用模板技巧

    template<typename T, size_t size>
    size_t GetSize(T (&arr)[size])
    {
         return size;
    }
    

    但这是一个巨大的矫枉过正:如果你经常使用不同的数组大小调用这样的函数,代码膨胀将是巨大的。

  3. 如果你的数组作为指针传递,并且没有记录的“数组结束”标志:不可能

  4. 如果您的数组具有“数组结束”标志:计算所有元素直到此标志。以空值终止的C字符串就是一个很好的例子:

    size_t strlen(const char *str)
    {
        size_t size = 0;
        while(*str++) 
           ++size;
        return size;
    }
    
  5. “真的必须使用数组”,例如,如果您使用某种带C接口的库。大多数此类库为您提供数组大小以及指向数组数据的指针,或者明确记录约定如何查找此类数组的结尾(C字符串除外。每个人都知道,它们以{{结尾) 1}})。任何这种方法都是不安全的。

    顺便说一下,我已经提到阵列是邪恶的吗? =)

答案 2 :(得分:2)

在不更改现有函数的签名的情况下,唯一的解决方案是在数组中添加“sentinel”元素 - 比如,一个数字可能不属于数组的合法部分。扫描阵列,直到找到该哨兵,并计算元素。这将为您提供数组的长度。这种方法类似于C字符串通过添加空终止来确定长度的方法。

当然在C ++中你有比平面数组更好的选择:使用std::vector<T>可以避免传递长度,因为vector<T>具有size()函数。

答案 3 :(得分:1)

如果它是一个普通的C数组,静态分配如下:

int a[5]

你可以通过

找到长度
sizeof(a)/sizeof(a[0])

但是,只有当你在非常“a”变量的范围内使用它时才会这样,并且长度基本上是在编译时计算的。

如果你想将数组传递给一个函数,例如以下签名:

void f (int *arr) 

然后有没有方法在函数内部找到该长度,因为它将泛型指针(或数组)转换为int。

答案 4 :(得分:1)

想要你也可以这样做,哪个在C中很常见。将数组的大小作为参数传递给函数。

例如,多个具有标量的载体

void scalar_mutliply ( double* vector, double scalar, unsigned size ) {
    for ( unsigned i = 0; i < size; ++i ){
        vector[i] *= scalar;
    }
}

并测试它:

using namespace std;

int main ( ) {

    double vector [] = { 1, 2, 3, 4 ,5 };

    scalar_mutliply( vector, 2, sizeof(vector)/sizeof(vector[0]) );
    for (int i = 0; i < sizeof(vector)/ sizeof(vector[0]); ++i ){
        cout << vector[i] << endl;
    }
    return 0;
}

导致此输出:

2
4
6
8
10

答案 5 :(得分:0)

考虑一下你可能能够在元素0中存储数组元素的数量,其余元素存储在其他元素中。