计算数组的非空元素

时间:2014-08-25 09:20:44

标签: c++ arrays visual-studio-2010 sizeof

我需要方法,它返回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)?

4 个答案:

答案 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';