如何获取经过增删、去重修改后的固定大小数组的实际有效元素数量
问题根本原因
你用sizeof(setarray)/sizeof(setarray[0])计算得到的是数组的总容量,这个值是编译阶段就确定的常量,仅和你声明数组时指定的大小有关,和数组内实际存储的有效元素数量没有任何关联,因此修改数组内容后这个值不会发生变化。
同时你现有代码存在语法错误:用#define定义的length是预处理常量,属于只读值,执行length--操作会直接编译报错。
可行的解决方法
方法1:单独维护有效长度变量(最推荐)
这是固定容量动态存储场景下性能最高、最常用的方案:
- 声明数组的同时,定义一个和数组作用域绑定的整型变量(例如命名为
valid_len),用来记录当前数组内的有效元素数量,初始值按照你首次填充的元素数量赋值 - 每次对数组执行新增、删除、去重等修改操作时,同步更新这个变量:比如删除1个元素就减1,新增1个元素就加1,你之前去重逻辑里要修改的就是这个可变变量,而非宏定义常量
- 后续需要获取数组实际大小时,直接读取
valid_len的值即可,没有任何额外计算开销
示例代码参考:
#define ARRAY_MAX_CAP 200 // 用宏定义数组总容量,不要和有效长度混淆 int array[ARRAY_MAX_CAP]; int valid_len = 0; // 初始有效长度为0 // 初始填充元素 for(int i=0; i<=100; i++) { array[i] = i; } valid_len = 101; // 填充完同步更新有效长度 // 去重逻辑修改为操作valid_len for(int i=0; i<valid_len; i++) { for(int j=i+1; j<valid_len; j++) { if(array[i] == array[j]) { for(int k=j; k < valid_len - 1; k++) { array[k] = array[k + 1]; } valid_len--; j--; } } }
方法2:设置哨兵值
如果不想单独维护变量,可以选择一个永远不会作为有效元素出现的值作为哨兵,放在有效元素的末尾:
- 比如你的有效元素都是非负整数,就可以选
-1作为哨兵值 - 每次修改数组完成后,在最后一个有效元素的下一个位置写入哨兵值
- 需要获取长度时遍历数组,直到碰到哨兵值为止,统计遍历过的元素个数就是实际有效长度
注意:该方法仅适合数组容量不大的场景,容量过大会产生较高的遍历开销。
方法3:使用动态容器
如果可以使用C++,直接替换原生静态数组为std::vector等动态容器,容器自带的size()方法可以直接返回当前实际存储的元素数量,不需要手动维护长度,开发效率更高。
内容的提问来源于stack exchange,提问作者user16910475
相关产品推荐
相关产品推荐

