#include #include #include #include #include "split.h" using std::cin; using std::cout; using std::endl; using std::getline; using std::istream; using std::string; using std::vector; using std::map; // find all the lines that refer to each word in the input map > xref(istream& in, vector find_words(const string&) = split) { string line; int line_number = 0; map > ret; // read the next line while (getline(in, line)) { ++line_number; // break the input line into words vector words = find_words(line); // remember that each word occurs on the current line #ifdef _MSC_VER for (std::vector::const_iterator it = words.begin(); #else for (vector::const_iterator it = words.begin(); #endif it != words.end(); ++it) ret[*it].push_back(line_number); } return ret; } int main() { // call `xref' using `split' by default map > ret = xref(cin); // write the results #ifdef _MSC_VER for (std::map >::const_iterator it = ret.begin(); #else for (map >::const_iterator it = ret.begin(); #endif it != ret.end(); ++it) { // write the word cout << it->first << " occurs on line(s): "; // followed by one or more line numbers #ifdef _MSC_VER std::vector::const_iterator line_it = it->second.begin(); #else vector::const_iterator line_it = it->second.begin(); #endif cout << *line_it; // write the first line number ++line_it; // write the rest of the line numbers, if any while (line_it != it->second.end()) { cout << ", " << *line_it; ++line_it; } // write a new line to separate each word from the next cout << endl; } return 0; } #include // 引入 map 容器,用于存储每个单词及其出现的行号 #include // 引入标准输入输出流库 #include // 引入字符串库 #include // 引入动态数组库,用于存储每一行的单词 #include "split.h" // 引入自定义的 split.h 库,假设包含用于分割字符串的函数 using std::cin; // 使用标准输入流 using std::cout; // 使用标准输出流 using std::endl; // 使用换行符 using std::getline; // 使用getline函数读取整行输入 using std::istream; // 使用输入流 using std::string; // 使用字符串类型 using std::vector; // 使用vector容器 using std::map; // 使用map容器 // xref函数:用来查找每个单词在文本中出现的行号 // 参数:输入流 in 和一个函数指针 find_words,用于分割每行的单词(默认为 split 函数) map > xref(istream& in, vector find_words(const string&) = split) { string line; // 用来存储每一行的文本 int line_number = 0; // 行号 map > ret; // 用map来存储每个单词及其对应的行号 // 按行读取输入 while (getline(in, line)) { ++line_number; // 增加行号 // 调用find_words函数将一行文本分割成单词 vector words = find_words(line); // 将当前行号添加到每个单词的对应位置 for (vector::const_iterator it = words.begin(); it != words.end(); ++it) ret[*it].push_back(line_number); // 将单词和行号对应起来 } return ret; // 返回包含每个单词及其行号的map } int main() { // 调用 xref 函数,默认使用 split 来分割单词 map > ret = xref(cin); // 输出结果 for (map >::const_iterator it = ret.begin(); it != ret.end(); ++it) { // 输出单词 cout << it->first << " occurs on line(s): "; // 获取并输出单词出现的行号 vector::const_iterator line_it = it->second.begin(); cout << *line_it; // 输出第一个行号 ++line_it; // 输出其余的行号 while (line_it != it->second.end()) { cout << ", " << *line_it; ++line_it; } // 换行 cout << endl; } return 0; // 程序结束 }