您好我在使用此代码时遇到了一些问题。
答案 0 :(得分:4)
计算唯一单词的最佳方法是使用std::unordered_map<std::string, int>
,然后在地图中增加值:wordMap[word]++;
请注意,如果这是单词的第一次出现,则会创建默认值并且是0,适合任务。
除此之外,当存在std :: sort时,自己实现排序并不好,这对绝大多数情况都很好。
答案 1 :(得分:1)
冒泡排序:
vector<string> strings = split(str);
for (int i = 0; i < strings.size(); i++) {
for (int j = 0; j < strings.size() - 1; j++) {
if (strings[j + 1] < strings[j]) {
string tmp = strings[j];
strings[j] = strings[j + 1];
strings[j + 1] = tmp;
}
}
}
订购后计算单词:
string prev = strings[0];
int counter = 1;
for (int i = 1; i < strings.size(); i++) {
if (strings[i] == prev) {
counter++;
} else {
cout << prev << ": " << counter << " ";
prev = strings[i];
counter = 1;
}
}
答案 2 :(得分:0)
您可以使用algorithm
中的std :: find:
std::find(strings.begin(), strings.end(), the_word_you_looking_for) != strings.end()
返回 bool(如果存在则为true,否则为false)。
您还可以设置一个计数器,然后在遇到的每个true
上增加它。
答案 3 :(得分:0)
执行相同操作的一种方法是将所有子字符串保存到向量中,然后在向量上使用std :: count函数并将结果放入映射中。这是示例代码
std::string s = "This is very good text and is really good to read";
// Putting all substrings into a vector.. Need code to do that, for simplicity I am showing here manually
vector<string> v1;
v1.push_back("This");
v1.push_back("is");
v1.push_back("very");
v1.push_back("good");
v1.push_back("text");
v1.push_back("and");
v1.push_back("is");
v1.push_back("rally");
v1.push_back("good");
v1.push_back("to");
v1.push_back("read");
// Map to create the result
map<string, int> mp;
for (auto v : v1) {
size_t n = std::count(v1.begin(), v1.end(), v);
mp[v] = n;
}
for (auto mvalue : mp) {
cout << "String = " << mvalue.first.c_str() << " Count Is " << mvalue.second << endl;
}