2024年12月完成(补充提交)

This commit is contained in:
Cx330 committed 2025-03-29 23:02:48 +08:00
commit 4e2bf47db0
39 files changed
+2106

No files matched your search

+148
View File
@@ -0,0 +1,148 @@
#include <map>
#include <iostream>
#include <string>
#include <vector>
#include <set>
#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;
using std::set;
// find all the lines that refer to each word in the input
map<string, set<int> >
xref(istream& in,
vector<string> find_words(const string&) = split)
{
string line;
int line_number = 0;
map<string, set<int> > ret;
// read the next line
while (getline(in, line)) {
++line_number;
// break the input line into words
vector<string> words = find_words(line);
// remember that each word occurs on the current line
#ifdef _MSC_VER
for (std::vector<string>::const_iterator it = words.begin();
#else
for (vector<string>::const_iterator it = words.begin();
#endif
it != words.end(); ++it)
ret[*it].insert(line_number);
}
return ret;
}
int main()
{
// call `xref' using `split' by default
map<string, set<int> > ret = xref(cin);
// write the results
#ifdef _MSC_VER
for (std::map<string, set<int> >::const_iterator it = ret.begin();
#else
for (map<string, set<int> >::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::set<int>::const_iterator line_it = it->second.begin();
#else
set<int>::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> // 引入映射容器库(map)用于存储每个单词与其出现行数的对应关系
#include <iostream> // 引入标准输入输出流库
#include <string> // 引入字符串库
#include <vector> // 引入动态数组(vector)容器库
#include <set> // 引入集合容器库(set)用于存储行号
#include "split.h" // 引入自定义头文件split.h,包含split函数的声明
using std::cin; // 引入标准输入流
using std::cout; // 引入标准输出流
using std::endl; // 引入换行符
using std::getline; // 引入getline函数,用于逐行读取输入
using std::istream; // 引入输入流类
using std::string; // 引入字符串类
using std::vector; // 引入动态数组类
using std::map; // 引入映射容器类
using std::set; // 引入集合容器类
// xref 函数:查找每个单词在输入中出现的行号
map<string, set<int> >
xref(istream& in, // 输入流(默认为cin)
vector<string> find_words(const string&) = split) // 使用split函数分割单词(默认)
{
string line; // 用于存储每行的文本
int line_number = 0; // 当前行号
map<string, set<int>> ret; // 存储单词及其出现的行号,使用map<单词, set<行号>>结构
// 逐行读取输入
while (getline(in, line)) {
++line_number; // 行号自增
// 将当前行拆分为单词(使用find_words函数,默认是split)
vector<string> words = find_words(line);
// 遍历当前行中的每个单词,将其对应的行号插入到map中
for (vector<string>::const_iterator it = words.begin(); it != words.end(); ++it)
ret[*it].insert(line_number); // 将单词及其行号存入map
}
return ret; // 返回map,包含每个单词及其出现的行号
}
int main()
{
// 调用xref函数,默认使用split函数进行单词拆分,输入来自cin
map<string, set<int>> ret = xref(cin);
// 输出结果:每个单词及其出现的行号
for (map<string, set<int>>::const_iterator it = ret.begin(); it != ret.end(); ++it) {
// 输出单词
cout << it->first << " occurs on line(s): ";
// 输出该单词出现的所有行号
set<int>::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; // 程序结束
}
+43
View File
@@ -0,0 +1,43 @@
#include <cctype>
#include <string>
#include <vector>
#include "split.h"
using std::vector;
using std::string;
#ifndef _MSC_VER
using std::isspace;
#endif
vector<string> split(const string& s)
{
vector<string> ret;
typedef string::size_type string_size;
string_size i = 0;
// invariant: we have processed characters `['original value of `i', `i)'
while (i != s.size()) {
// ignore leading blanks
// invariant: characters in range `['original `i', current `i)' are all spaces
while (i != s.size() && isspace(s[i]))
++i;
// find end of next word
string_size j = i;
// invariant: none of the characters in range `['original `j', current `j)' is a space
while (j != s.size() && !isspace(s[j]))
++j;
// if we found some nonwhitespace characters
if (i != j) {
// copy from `s' starting at `i' and taking `j' `\-' `i' chars
ret.push_back(s.substr(i, j - i));
i = j;
}
}
return ret;
}
+8
View File
@@ -0,0 +1,8 @@
#ifndef GUARD_split_h
#define GUARD_split_h
#include <vector>
#include <string>
std::vector<std::string> split(const std::string&);
#endif