这个功能能用vector实现吗
时间: 2024-09-20 21:10:45 浏览: 30
当然可以,`std::vector`本身并不直接支持计数每个元素(如单词)的出现次数,但它可以配合其他数据结构来实现。一个常见的做法是先使用`std::vector`存储单词,然后遍历这个向量去创建另一个`std::map`或`std::unordered_map`来计数每个单词的出现。这里是一种可能的实现方式:
```cpp
#include <iostream>
#include <sstream>
#include <vector>
#include <map>
#include <algorithm> // 使用lower_case_copy进行大小写转换
std::map<std::string, int> countWords(const std::string& input) {
std::istringstream iss(input);
std::vector<std::string> words; // 存储单词
std::string word;
while (iss >> word) {
words.push_back(word);
}
std::map<std::string, int> wordCount;
for (const auto& w : words) {
wordCount[w]++; // 计算每个单词的出现次数
}
// 处理大小写和停用词(假设我们有一个停用词集合 stopwords)
std::set<std::string> stopwords;
for (auto &pair : wordCount) {
if (stopwords.find(pair.first) != stopwords.end()) {
continue; // 跳过停用词
}
pair.second = std::tolower(pair.first); // 将所有单词转为小写
wordCount[pair.second]++;
}
return wordCount;
}
int main() {
// ... 主函数部分保持不变
}
```
在这个版本中,我们将单词存储在一个`std::vector`里,然后再遍历这个向量统计。注意这里我们对每个单词进行了小写化处理,并可以选择性地跳过停用词。
如果你想优化性能,可以考虑使用`std::unordered_map`替换`std::map`,因为查找操作的时间复杂度会从O(log n)降低到O(1)。
阅读全文