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

reduce the size of the table by deleting null values

本文关键字:删除 空值      更新时间:2023-10-16

我正在使用c++编码霍夫曼,我有一个int表(计数[26])来计算频率(现在是充满值)。在文本中使用的字母数只有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; 
}
}

std::copy_if正好解决了这个问题。

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

counterfrequencies设置为std::vector,这样您就可以在frequencies中最后一个有效元素的旁边设置迭代器,用于清理/调整大小。

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);
}

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

在这种情况下,您选择的数据结构是错误的。似乎您正在将每个字符与其各自的计数进行映射,然后您想要过滤掉不存在的字符计数。您应该使用std::map

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

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

我只是一个业余爱好者:)

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++;
}
}