当数小于初始化索引时,确定数组中元素数的方法?

时间:2017-03-31 23:12:12

标签: c++ arrays

我有一个初始化为17的数组,它存储了一定数量的元素。问题是,当我尝试使用sizeof()方法或每个元素的循环和计数器来查找大小时,我得到17,但这不是数组中存储的元素数量,只是大小。有谁知道如何找到数组中元素的实际数量,而不仅仅是它的初始化大小?

到目前为止我尝试过的代码:

方法1:

int arr[17];
//after reading in the data from the file
cout << sizeof(arr)/sizeof(arr[0])<< endl;
//this just prints 17

方法2:

int arr[17]
int counter = 0;
for (int i: arr)
{
 counter++;
}
cout << counter << endl;
//just prints 17

1 个答案:

答案 0 :(得分:2)

sizeof()在编译时进行评估,而不是在运行时进行评估。无论您存储多少个值,固定数组的大小都将是一个常量值。

您有三种选择:

  1. 定义一个永远不会出现在实际数据中的岗哨值,用该值预先填充数组,然后计算不等于该值的元素数量:

    #include <algorithm>
    
    bool isNotSentry(int value) { return (value != -1); }
    
    ...
    
    int arr[17];
    std::fill(arr, arr+17, -1);
    
    ...
    
    //when adding a value to the array...
    arr[index] = ...;
    
    ...
    
    //after reading in the values from the file
    int count = std::count_if(arr, arr+17, isNotSentry);
    std::cout << count << std::endl;
    

    或者,如果使用C ++ 11或更高版本:

    #include <array>
    
    std::array<int, 17> arr;
    arr.fill(-1);
    
    ...
    
    //when adding a value to the array...
    arr[index] = ...;
    
    ...
    
    //after reading in the values from the file
    int count = std::count_if(arr.cbegin(), arr.cend(), [](const int value){ return (value != -1); });
    std::cout << count << std::endl;
    
  2. 手动跟踪您在数组中放入的值的数量:

    int arr[17];
    int count = 0;
    
    ...
    
    //when adding a value to the array...
    arr[count++] = ...;
    
    ...
    
    //after reading in the values from the file
    std::cout << count << endl;
    
  3. 上述方法假设数据最多不超过17个值。但是如果你事先不知道实际存在多少个值,那么就不要使用固定长度的数组开始。请改用std::vector,根据需要动态调整自身大小:

    #include <vector>
    
    std::vector<int> arr;
    arr.reserve(17); // <-- optional
    
    ...
    
    //when adding a value to the vector...
    arr.push_back(...);
    
    ...
    
    //after reading in the values from the file
    std::cout << arr.size() << std::endl;