<分区>
我正在输入一个字 rune 件,每个单词在 vector 中都有自己的位置。然后我需要跟踪每个单词并找出每个唯一单词出现了多少次,这样:
一共有三棵树树
应该输出:
有 1 是 1 三个 1 树木 3
我想知道如何使用字符串 vector 来记录每个单词。 我会做一个字符串 vector ,每个字符串都有一个 int vector 吗?
<分区>
我正在输入一个字 rune 件,每个单词在 vector 中都有自己的位置。然后我需要跟踪每个单词并找出每个唯一单词出现了多少次,这样:
一共有三棵树树
应该输出:
有 1 是 1 三个 1 树木 3
我想知道如何使用字符串 vector 来记录每个单词。 我会做一个字符串 vector ,每个字符串都有一个 int vector 吗?
最佳答案
不要用 Screwdriver 钉钉子。 std::vector
, 对于这项任务的最基本形式并不是特别有用:简单的频率计算。来自标准输入的任意输入最好利用关联容器,其中键是输入字符串,值是累积频率。
无序频率计算
无序映射类, std::unordered_map
, 键入 std::string
并映射到该字符串的频率计数器,可用于跟踪基本频率。例如:
#include <iostream>
#include <vector>
#include <string>
#include <unordered_map>
int main()
{
std::unordered_map<std::string, unsigned> m;
std::string word;
while (std::cin >> word)
++m[word]; // increment the count for this word
for (auto const& pr : m)
std::cout << pr.first << ':' << pr.second << '\n';
}
字典顺序频率
注意:使用关联容器没有特定的顺序 std::unordered_map
(由此得名)。如果您需要字典顺序,您可以简单地使用常规 std::map
.比如:
#include <iostream>
#include <vector>
#include <string>
#include <map>
int main()
{
std::map<std::string, unsigned> m;
std::string word;
while (std::cin >> word)
++m[word];
for (auto const& pr : m)
std::cout << pr.first << ':' << pr.second << '\n';
}
位置保留频率计算
在计算频率计数器的同时维护输入流中单词出现的位置也是可能的,并且只需要多一点代码。像我们之前所做的那样选择无序或有序的关联容器,而不是映射到 unsigned
, 我们映射到 std::vector<unsigned>
,我们在消耗输入词时累积一个词计数器。每个 vector 的总体大小仍然保留频率计数器,但 vector 本身保留输入流中关联词出现的位置。例如:
#include <iostream>
#include <vector>
#include <string>
#include <map>
int main()
{
std::map<std::string, std::vector<unsigned int>> m;
std::string word;
unsigned ctr = 0;
while (std::cin >> word)
m[word].push_back(++ctr);
for (auto const& pr : m)
{
std::cout << pr.first << ':' << pr.second.size() << " { ";
for (auto pos : pr.second)
std::cout << pos << ' ';
std::cout << "}\n";
}
}
这将产生以下形式的输出:
word : frequency { n1 n2 n3... }
哪里word
是一个不同的词,frequency
是输入流中的总频率,n1,n2,n3,...
是单词在处理过程中出现的位置(从 1 开始)。
希望其中一种方法有用。
关于c++ - 带有计数器 C++ 的字符串 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46162286/