通过删除空值来减小表的大小

时间:2016-11-08 01:38:17

标签: c++

我正在使用C ++对霍夫曼进行编码,我有一个int表(count [26])来计算频率(现在是Full的值)。文本中使用的字母数只有16,所以计数器表的其余部分用0分配,我想得到一个没有0的纯表,大小为16

我应该使用任何功能吗?

这里只是一个代码示例(我把值放在counter []上):

int counter[26] = {1, 2, 3, 0, 5, 4, 1, 10, 0, 0, 0, 0, 5, 5, 8, 7, 1, 4, 0, 1, 0, 0, 8, 0, 0, 0};
int frequencies[16]={0};
for (int y=0; y<26 ;y++){
        if (counter[y] != 0){
            frequencies[y]=counter[y];
            cout<<"\n frequency table :  "<< frequencies[y]<<endl; 

}

}

3 个答案:

答案 0 :(得分:2)

std::copy_if完全解决了这个问题。

通过std::begin(a), std::end(a), std::begin(b), [](int x)->bool{ return x; }将非零元素从数组a复制到数组b

答案 1 :(得分:0)

counterfrequencies作为 std :: vector ,以便在{{中的最后一个有效元素旁边放置 iterator 1}},用于清理/调整大小。

frequencies
  

我想得到一个没有0的纯表,大小为16

在这种情况下,您选择的数据结构是错误的。您似乎正在使用各自的计数映射每个字符,然后您想要过滤掉不存在的字符计数。您应该使用vector<int> counter = {1, 2, 3, 0, 5, 4, 1, 10, 0, 0, 0, 0, 5, 5, 8, 7, 1, 4, 0, 1, 0, 0, 8, 0, 0, 0}; vector<int> frequencies(counter.size()); auto it = std::copy_if (counter.begin(), counter.end(), frequencies.begin(), [](int i){return (i > 0);} ); while(it != frequencies.end()){ frequencies.erase(it); }

答案 2 :(得分:0)

我解决了这个问题,我只是添加了一个整数作为计数器(在0到15的频率表中),小&amp;简单的解决方案

非常感谢你的回答&amp;谢谢你的帮助

我只是一个业余选手:)

int counter[26] = {1, 2, 3, 0, 5, 4, 1, 10, 0, 0, 0, 0, 5, 5, 8, 7, 1, 4, 0, 1, 0, 0, 8, 0, 0, 0};
int j=0; // 

int frequencies[16]={0};
for (int y=0; y<26 ;y++){

        if (counter[y] != 0 && letters[y] !='0'){
            frequencies[j]=counter[y];
            cout<<"\n tableau frequence :  "<< frequencies[j]<<endl; 
            j++;

}

}