我需要方法,它返回ints
数组的非空元素的数量。 sizeof(arr)/sizeof(type)
,如下所示:
int table[255]={1,2,3,'a','b'};
cout << "size of: " << sizeof(table)/sizeof(int) << endl;
返回255
,但我需要计算元素,因此结果为5
我应该自己制作while loop
还是有嵌入式功能(我使用Visual Studio 2010)?
答案 0 :(得分:3)
假设T array[N] = {};
的非空元素是默认初始化的元素 - T t{};
,答案是:是的,有一个标准算法用于计算与给定模式匹配的元素,或满足给定条件,即std::count
// include header file where the algorithm is defined:
#include <algorithm>
// use std::count to count 0 elements, which is a default value all elements
// are initialized with for int tab[N] = {};
// and subtract this value from the total number of elements of array
int howMany = 255 - std::count(table, table + 255, 0);
// table and table+255 specify the ranges the algorithm operate on
答案 1 :(得分:0)
如果您使用的是C ++,为什么不使用std::vector
之类的C ++容器并使用<algorithm>
?
无论如何,sizeof()
总是会返回255 * sizeof(int),因为该表将在内存中包含255个int。
答案 2 :(得分:0)
<强> 8.5.1.7 强> 如果列表中的初始化子条款少于聚合中的成员,则每个成员 未明确初始化的应从空初始化列表初始化。对于int,表达式为int(),即0。
您可以使用算法中的std :: count,但有一个问题
int table[255]={1,0 <<< this value were stetted by user and it is not an 'empty',3,'a','b'};
那么如何区分默认初始化程序分配的0和实际值0?作为解决方案,您可能应该使用一些INVALID_VALUE定义来设置数组中元素的值,因为0不是将值标记为未分配的最佳选择。并将您的数组初始化为
memset(table, INVALID_VALUE, table_size);
答案 3 :(得分:0)
可以通过编写自己的函数模板来完成,如下所示:
template<typename It>
unsigned count_non_val(It first, It last, const decltype(*first)& val){
unsigned result=0;
for(It i=first; i!=last; ++i)
if(*i!=val)
++result;
return result;
}
//用法:
std::cout<<count_non_val(table, table+255, 0)<<'\n';