我正在使用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;
}
}
答案 0 :(得分:2)
std::copy_if
完全解决了这个问题。
通过std::begin(a), std::end(a), std::begin(b), [](int x)->bool{ return x; }
将非零元素从数组a
复制到数组b
。
答案 1 :(得分:0)
将counter
和frequencies
作为 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++;
}
}