C++ 哪种方法更适合哈夫曼编码?我想用它们的频率读取字符

C++ 哪种方法更适合哈夫曼编码?我想用它们的频率读取字符,c++,string,char,frequency,huffman-code,C++,String,Char,Frequency,Huffman Code,从字符串读取字符的两个循环 void ReadCharWithFreq(string str){ int n = str.size(); int count = 0; // loops to read all char from string and frequency for(int i = 0;i<n;i++){ for(int x =0;x<n;x++ ){ if(str[i]==str[x]){

从字符串读取字符的两个循环

void ReadCharWithFreq(string str){ 
    int n = str.size();  
    int count = 0;

    // loops to read all char from string and frequency
    for(int i = 0;i<n;i++){
        for(int x =0;x<n;x++ ){
            if(str[i]==str[x]){
                count++;
            }
        }       

        //enqueue char with frequency
        enqueue(str[i],count);
        count=0;
    }
} //end of function
void ReadCharWithFreq(字符串str){
int n=str.size();
整数计数=0;
//循环从字符串和频率中读取所有字符

对于(int i=0;i我将使用
std::array
,其空间足以容纳可能遇到的所有字符的计数:

#include <array>
#include <limits>

constexpr size_t ArrSize = std::numeric_limits<unsigned char>::max()+1;

std::array<unsigned char, ArrSize> ReadCharWithFreq(const std::string& str){
    std::array<unsigned char, ArrSize> freq{};
    for(unsigned char ch : str)
        freq[ch]++;
    return freq;
}
#包括
#包括
constexpr size\u t ArrSize=std::numeric\u limits::max()+1;
std::array ReadCharWithFreq(const std::string&str){
std::数组频率{};
for(无符号字符ch:str)
频率[ch]++;
返回频率;
}
用法示例:

#include <iostream>
#include <iomanip>
#include <vector>

int main(int argc, char* argv[]) {
    std::vector<std::string> args(argv+1, argv+argc);

    for(const auto& str : args) {
        auto result = ReadCharWithFreq(str);

        for(size_t i=0; i<ArrSize; ++i) {
            if(result[i]) {
                std::cout << std::setw(3) << i << " " << static_cast<char>(i) << " " << static_cast<int>(result[i]) << "\n";
                // enqueue here? 
            } 
        }
    }
}
#包括
#包括
#包括
int main(int argc,char*argv[]){
标准::向量args(argv+1,argv+argc);
用于(常量自动和str:args){
自动结果=ReadCharWithFreq(str);

对于(size_t i=0;第二种方法会更快,但什么是
freq
?使用
std::array
填充为0。为什么
-“a”
?空格的索引为负数”!“等等,您确定输入字符串中的所有字符都>=“a”吗?
#include <iostream>
#include <iomanip>
#include <vector>

int main(int argc, char* argv[]) {
    std::vector<std::string> args(argv+1, argv+argc);

    for(const auto& str : args) {
        auto result = ReadCharWithFreq(str);

        for(size_t i=0; i<ArrSize; ++i) {
            if(result[i]) {
                std::cout << std::setw(3) << i << " " << static_cast<char>(i) << " " << static_cast<int>(result[i]) << "\n";
                // enqueue here? 
            } 
        }
    }
}