void analyseAnagram(const vector<string> & dictionary) { cout << "请输入单词(或任意字母序列)" << endl; for (string_input p(cin); p != string_input(); ++p) { cout << "查找输入单词的变位词中..." << endl; string word = *p; sort(word.begin(), word.end()); bool found_one = false; do { if (binary_search(dictionary.begin(), dictionary.end(), word)) { cout << " " << word ; found_one = true; } } while (next_permutation(word.begin(), word.end())); if (!found_one) cout << " 抱歉,没有找到变位词\n"; cout << "\n请输入下一个单词 " << "(或输入Ctrl+Z终止程序 ) \n" << endl; } }
时间: 2024-04-23 15:26:57 浏览: 62
这段代码实现了一个函数`analyseAnagram`,它接受一个字符串向量`dictionary`作为参数,并且通过不断读入用户输入的单词或字母序列,查找其在`dictionary`中的变位词并输出。具体实现如下:
1. 首先输出提示信息,让用户输入要查找的单词。
2. 进入循环,不断读入用户的输入单词或字母序列。
3. 对于每个输入单词,先将其排序,然后通过`binary_search`函数在`dictionary`中查找其变位词是否存在。
4. 如果找到了变位词,则输出变位词;否则输出提示信息表明没有找到。
5. 输出提示信息,让用户输入下一个单词,继续循环。
6. 如果用户输入了Ctrl+Z,则程序终止。
需要注意的是,这段代码使用了标准库中的`sort`函数和`binary_search`函数,以及`next_permutation`函数来生成一个字符串的所有排列。同时,它还重载了输入流运算符`>>`来读入用户的输入。
相关问题
优化改进以下代码#include <iostream> #include <fstream> #include <string> #include <vector> #include <algorithm> #include <iterator> using namespace std; typedef istream_iterator<string> string_input; void welcome() { cout << "******************* 变位词查找系统*********************\n" << "在词典中找出给定的字符串的所有变位词" << endl; } void readDict(vector<string> & dictionary) { cout << "首先,请输入词典的文件名称:" << endl; string dictionary_name; cin >> dictionary_name; ifstream ifs(dictionary_name.c_str()); if (!ifs.is_open()) { cerr << "异常:文件"<< dictionary_name << "没有找到 " << endl; exit(1); } cout << "词典读入中 ..." << flush; copy(string_input(ifs), string_input(), back_inserter(dictionary)); sort(dictionary.begin(),dictionary.end()); cout << "词典包含有 " << dictionary.size() << " 个单词\n\n"; ifs.close(); } void analyseAnagram(const vector<string> & dictionary) { cout << "请输入单词(或任意字母序列)" << endl; for (string_input p(cin); p != string_input(); ++p) { cout << "查找输入单词的变位词中..." << endl; string word = *p; sort(word.begin(), word.end()); bool found_one = false; do { if (binary_search(dictionary.begin(), dictionary.end(), word)) { cout << " " << word ; found_one = true; } } while (next_permutation(word.begin(), word.end())); if (!found_one) cout << " 抱歉,没有找到变位词\n"; cout << "\n请输入下一个单词 " << "(或输入Ctrl+Z终止程序 ) \n" << endl; } } int main() { welcome(); vector<string> dictionary; readDict(dictionary); analyseAnagram(dictionary); system("pause"); return 0; }
以下是一些可以优化改进的建议:
1. 在读入词典文件时,可以使用 ifstream 的构造函数来打开文件,避免在程序中使用 c_str() 函数。可以将以下代码:
```
ifstream ifs(dictionary_name.c_str());
```
改为:
```
ifstream ifs(dictionary_name);
```
2. 在查找变位词时,可以使用 unordered_set 来存储词典中的单词,这样可以提高查找速度,避免使用 binary_search 函数。可以将以下代码:
```
sort(dictionary.begin(),dictionary.end());
...
if (binary_search(dictionary.begin(), dictionary.end(), word))
```
改为:
```
unordered_set<string> dict_set(dictionary.begin(), dictionary.end());
...
if (dict_set.count(word))
```
3. 在查找变位词时,可以使用一个 map 来记录每个单词的字母出现次数,避免使用 next_permutation 函数。可以将以下代码:
```
sort(word.begin(), word.end());
...
do {
if (binary_search(dictionary.begin(), dictionary.end(), word)) {
...
}
} while (next_permutation(word.begin(), word.end()));
```
改为:
```
unordered_map<char, int> word_count;
for (char c : word) {
++word_count[c];
}
...
for (const string& dict_word : dictionary) {
unordered_map<char, int> dict_count;
for (char c : dict_word) {
++dict_count[c];
}
if (dict_count == word_count) {
...
}
}
```
4. 可以添加一些错误处理机制,例如:输入单词为空时,应提示重新输入;输入的文件名不存在时,应提示用户重新输入;等等。
5. 可以添加一些优化,例如:将读入的词典文件进行缓存,避免每次查找变位词时都需要重新读入文件;在查找变位词时,可以先判断输入单词是否本身就是词典中的单词,避免进行不必要的计算。
该程序如果如果指定存储结构请写出该存储结构的定义#include <iostream> #include <fstream> #include <string> #include <vector> #include <algorithm> #include <iterator> using namespace std; typedef istream_iterator<string> string_input; void welcome() { cout << "******************* 变位词查找系统*********************\n" << "在词典中找出给定的字符串的所有变位词" << endl; } void readDict(vector<string> & dictionary) { cout << "首先,请输入词典的文件名称:" << endl; string dictionary_name; cin >> dictionary_name; ifstream ifs(dictionary_name.c_str()); if (!ifs.is_open()) { cerr << "异常:文件"<< dictionary_name << "没有找到 " << endl; exit(1); } cout << "词典读入中 ..." << flush; copy(string_input(ifs), string_input(), back_inserter(dictionary)); sort(dictionary.begin(),dictionary.end()); cout << "词典包含有 " << dictionary.size() << " 个单词\n\n"; ifs.close(); } void analyseAnagram(const vector<string> & dictionary) { cout << "请输入单词(或任意字母序列)" << endl; for (string_input p(cin); p != string_input(); ++p) { cout << "查找输入单词的变位词中..." << endl; string word = *p; sort(word.begin(), word.end()); bool found_one = false; do { if (binary_search(dictionary.begin(), dictionary.end(), word)) { cout << " " << word ; found_one = true; } } while (next_permutation(word.begin(), word.end())); if (!found_one) cout << " 抱歉,没有找到变位词\n"; cout << "\n请输入下一个单词 " << "(或输入Ctrl+Z终止程序 ) \n" << endl; } } int main() { welcome(); vector<string> dictionary; readDict(dictionary); analyseAnagram(dictionary); system("pause"); return 0; }
该程序使用了 vector 存储结构来存储词典中的单词。具体来说,定义了一个 vector<string> 类型的变量 dictionary 来存储单词,并使用 push_back() 函数将单词逐一添加到 vector 中。在读取完所有单词后,使用 sort() 函数对 vector 进行排序,以便后续的二分查找。在查找变位词时,使用了 string 类型的变量 word 来存储输入的单词,并将其排序后与 dictionary 中的单词逐一比较,以查找变位词。
阅读全文