我想知道是否有人可以帮助我。我试图使用列表或结构作为容器来计算文本文件中字母的频率,并且在查找解决方案时遇到一些麻烦。
我在下面有一些代码并且首先尝试使用temporaryArrayList
,但无法弄清楚如何使用指针轻松导航此对象。有没有人有关于arrayListContainer
中如何添加和浏览条目的示例?我不像struct
那样可扩展容器吗?
如果我可以使用struct
我宁愿这样做,但在阅读struct
文档后,无法在本网站或网站上找到任何有用的示例。我需要一个std::list
变量和一个std::list
包含找到的字母的整数,整数是我找到每个字母的次数的计数器。
这里有人可以帮忙吗?
感谢。
到目前为止代码:
char
答案 0 :(得分:1)
您可以尝试一下,使用std :: map就像在其他语言中使用dict一样,它更快,更容易,更具诱惑力,如果您想稍后支持UTF编码,已经解决了问题。
但如果您已经知道它只会用于ASCII文本,则还有另一种方法。
您的Universe for ASCII为0-255(实际为0-128,但如果有人使用扩展ASCII,请忽略它)。这意味着我们实际上可以在合理的空间内用
覆盖所有结果std::array<std::size_t, 256> letters= {0};
然后您可以用
替换内循环for (int i = 0; i < sizeof(line); i++) {
ch = toupper(line[i]);
letter[ch]++;
}
然后写出结果
for (char ch = 'A'; ch <= 'Z'; ch++) {
std::cout << "Letter: '" << ch << "' occured " << letter[ch] << " times\n";
}
这应该与std::map
的空间使用大致相同,但更好的位置和更好的查找时间。你可以使用只有27个字母,但这增加了更多的条件。
答案 1 :(得分:0)
正如其他人在您的问题评论中所建议的那样,std::map
就是您所需要的。使用USE master GO xp_readerrorlog 0, 1, N’Server is listening on’ GO
,您可以将出现次数映射到相应的字符。
这是一个简单的例子:
std::map
当您打算使用具有快速插入和移除功能的容器时,std::list
很好。访问#include <iostream>
#include <string>
#include <map>
int main() {
std::string hello { "Hello, World!" };
std::map<char, std::size_t> letterCounts;
for(char ch : hello)
letterCounts[ch]++;
for(auto& elem : letterCounts)
std::cout << elem.first << ": " << elem.second << std::endl;
}
内的元素很慢。
答案 2 :(得分:0)
以下是我使用map
和structured binding
来计算字母频率的示例
使用了c ++ 17的新功能
1.If语句与初始化程序
- 结构绑定
醇>
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
int main()
{
std::map<char,int> counterOfChar;
std::string My("Once upon a time there was a lion who was very funny in reading text and counting them");
std::for_each(My.begin(), My.end(), [&counterOfChar](const char& n)
{ //'if' initialization statements are a C++1z extension
if (auto [iter,success] = counterOfChar.insert(std::make_pair(toupper(n),1) ) ;success == false)
{
counterOfChar[iter->first] = ++iter->second;
}
});
for (const auto &[character,count]:counterOfChar)
{
std::cout<<character<<" "<<count<<std::endl;
}
return 0;
}
输出
17
A 6
C 2
D 2
E 8
F 1
G 2
H 3
I 5
L 1
M 2
N 10
O 5
P 1
R 3
S 2
T 6
U 3
V 1
W 3
X 1
Y 2
Program ended with exit code: 0