C++ 我如何在不使用开关的情况下对字符串进行频率分析

C++ 我如何在不使用开关的情况下对字符串进行频率分析,c++,huffman-code,frequency-analysis,C++,Huffman Code,Frequency Analysis,我正在做一个学校项目,在文本上实现哈夫曼代码。当然,第一部分需要对文本进行频率分析。除了一个巨大的开关和一系列计数器之外,还有更好的方法吗 即: int[]计数器 对于(inti=0;i为什么不: int counters[256] = {0}; for(int i = 0; i <inString.length(); i++) counters[inString[i]]++; } std::cout << "Count occurences of \'a\'" &

我正在做一个学校项目,在文本上实现哈夫曼代码。当然,第一部分需要对文本进行频率分析。除了一个巨大的开关和一系列计数器之外,还有更好的方法吗

即:

int[]计数器
对于(inti=0;i为什么不:

int counters[256] = {0};
for(int i = 0; i <inString.length(); i++)
    counters[inString[i]]++;
}


std::cout << "Count occurences of \'a\'" << counters['a'] << std::endl;
int计数器[256]={0};

对于(int i=0;i,可以使用按字符索引的数组:

int counters[256];
for (int i = 0; i < inString.length(); i++) {
    counters[(unsigned char)inString[i]]++;
}
int计数器[256];
对于(int i=0;i

当然,您还需要将
计数器
数组初始化为零。

使用映射似乎完全适用:

map<char,int> chcount;
for(int i=0; i<inString.length(); i++){
  t=inString[i];
  chcount[i]? chcount[i]++ : chcount[i]=1;
}
map-chcount;

for(int i=0;i)和那些在家玩优化游戏的人,
for(int i=inString.length()-1;i>=0;i-)
。@Dav:如果您想优化,请取消对
inString.length()的调用
而不是循环外。倒计时通常会适得其反,原因很简单,因为您的缓存可能没有预料到这一点——而一次缓存未命中将花费更多的比较。更重要的是,将其从条件值移动到初始值设定项会减少对
.length()的函数调用
。但是,将其移出循环也可以很好地工作。我通常以
的形式编写(int I=0,imax=inString.length();I
。如果你从国有化字符集的世界冒险进入广阔的Unicode世界,这一点尤其正确。
map<char,int> chcount;
for(int i=0; i<inString.length(); i++){
  t=inString[i];
  chcount[i]? chcount[i]++ : chcount[i]=1;
}