如何获取C++固定大小部分填充数组的实际有效元素个数
C++ 原生的固定长度数组本身不存储「已填充元素个数」的信息,你用sizeof(arr)/sizeof(arr[0])计算得到的永远是数组声明时的总容量,和你实际存入多少元素没有关系。原生数组未显式赋值的位置存储的是随机的脏数据,没有任何标记区分是否被用户填充过,你可以通过以下几种方式实现需求:
方案1:单独维护计数变量(最高效、最常用)
额外声明一个变量记录已存入的元素数量,每次向数组新增元素时同步更新这个计数即可:
int arr[5]; int actual_size = 0; // 记录实际存入的元素数 arr[0] = 1; actual_size++; arr[1] = 2; actual_size++; // 直接输出actual_size就能得到2 cout << actual_size;
方案2:设置哨兵值标记未使用位置(有适用场景限制)
如果你的业务场景中可以确定一个不会用到的数值作为「未使用」的标记,可以先把数组所有元素初始化为这个哨兵值,需要统计实际元素数时遍历数组统计非哨兵值的元素个数即可:
int arr[5]; // 先把所有元素初始化为哨兵值,比如这里假设业务不会用到-1 for(int i=0; i<5; i++) arr[i] = -1; arr[0] = 1; arr[1] = 2; int actual_size = 0; for(int i=0; i<5; i++){ if(arr[i] != -1) actual_size++; } cout << actual_size;
注意:该方案仅适用于哨兵值不会出现在你的业务有效取值范围内的场景,否则会统计错误。
方案3:使用STL容器替代原生数组(工程实践更推荐)
C++标准库提供的std::vector动态数组容器,本身内置了实际元素计数的功能,调用size()方法即可直接得到实际存入的元素数,不需要你自己手动维护计数:
#include <vector> #include <iostream> using namespace std; int main(){ vector<int> arr; // 可以预先预留5个空间,不影响size的计数 arr.reserve(5); arr.push_back(1); arr.push_back(2); // 输出结果为2 cout << arr.size(); return 0; }
内容的提问来源于stack exchange,提问作者Vivek
相关产品推荐
相关产品推荐

