我有一个初始化为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
答案 0 :(得分:2)
sizeof()
在编译时进行评估,而不是在运行时进行评估。无论您存储多少个值,固定数组的大小都将是一个常量值。
您有三种选择:
定义一个永远不会出现在实际数据中的岗哨值,用该值预先填充数组,然后计算不等于该值的元素数量:
#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;
手动跟踪您在数组中放入的值的数量:
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;
上述方法假设数据最多不超过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;