我正在尝试查找字母表中每个字母在用户创建的随机字符串中出现的次数。我拥有所有代码,减去每次发现一个字符时要计数的部分。我尝试使用几个for...else
循环来解决这个问题,但是也许我只是没有学会正确地做到这一点,在输出的其余部分我总是出错或出现空白。
我想要的是输出看起来像这样:
A B C D E F G...
1 2 5 7 0 9 2...
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <map>
using namespace std;
int main() {
int i=0, n;
char alphabet[26];
char c;
char RandomStringArray [100];
srand(time(0));
cout <<"How many letters do you want in your random string (no less than 0, no more than 100): ";
cin >> n;
for (int i=0; i<=25; i++)
alphabet[i] = 'a' + i;
while(i<n) {
int temp = rand() % 26;
RandomStringArray[i] = alphabet[temp];
i++;
}
for(i=0; i<n; i++)
cout<<RandomStringArray[i];
cout<<"\n\n";
/*for(c = 'A'; c <= 'Z'; ++c)
cout<<" "<<c;
cout<<"\n";
*/
map<char,size_t> char_counts;
for (int i = 0; i < n; ++i) ++char_counts[RandomStringArray[i]];{
for (char ch :: alphabet) std::cout << ch << ' ';{
std::cout << '\n';
}
for (char ch :: alphabet) std::cout << char_counts[ch] <<'';{
std::cout << '\n';
}
}
}
答案 0 :(得分:1)
std::unordered_map
对这种事情有好处。它类似于对每个字符进行计数的数组方法,但是使用起来更方便,尤其是当您感兴趣的字符范围不连续时。
索引std::unordered_map
时,映射的值将通过引用返回,因此只需增加它即可。如果不存在,则会创建它并默认初始化(对于整数类型,初始化为零)。
所以您要做的就是:
std::unordered_map<char, std::size_t> char_counts;
for (int i = 0; i < n; ++i) ++char_counts[RandomStringArray[i]];
此后,char_counts
保留字符串中所有字符的总出现次数。例如char_counts['a']
是'a'
的出现次数。
然后将它们全部打印出来:
for (char ch : alphabet) std::cout << ch << ' ';
std::cout << '\n';
for (char ch : alphabet) std::cout << char_counts[ch] << ' ';
std::cout << '\n';