149 lines
4.0 KiB
C++
Raw Normal View History

2025-03-29 23:02:48 +08:00
#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> // <20><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣨map<61><70><EFBFBD><EFBFBD><EFBFBD>ڴ洢ÿ<E6B4A2><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD>Ӧ<EFBFBD><D3A6>ϵ
#include <iostream> // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#include <string> // <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
#include <vector> // <20><><EFBFBD>붯̬<EBB6AF><CCAC><EFBFBD>飨vector<6F><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#include <set> // <20><><EFBFBD><EFBFBD><EBBCAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⣨set<65><74><EFBFBD><EFBFBD><EFBFBD>ڴ洢<DAB4>к<EFBFBD>
#include "split.h" // <20><><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>split.h<><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD>split<69><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
using std::cin; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
using std::cout; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
using std::endl; // <20><><EFBFBD><EFBFBD>з<EFBFBD>
using std::getline; // <20><><EFBFBD><EFBFBD>getline<6E><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
using std::istream; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
using std::string; // <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
using std::vector; // <20><><EFBFBD>붯̬<EBB6AF><CCAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
using std::map; // <20><><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
using std::set; // <20><><EFBFBD><EFBFBD><EBBCAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// xref <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3>ֵ<EFBFBD><D6B5>к<EFBFBD>
map<string, set<int> >
xref(istream& in, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>Ϊcin<69><6E>
vector<string> find_words(const string&) = split) // ʹ<><CAB9>split<69><74><EFBFBD><EFBFBD><EFBFBD>ָ<D6B8>ʣ<EFBFBD>Ĭ<EFBFBD>ϣ<EFBFBD>
{
string line; // <20><><EFBFBD>ڴ洢ÿ<E6B4A2>е<EFBFBD><D0B5>ı<EFBFBD>
int line_number = 0; // <20><>ǰ<EFBFBD>к<EFBFBD>
map<string, set<int>> ret; // <20><EFBFBD><E6B4A2><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>кţ<D0BA>ʹ<EFBFBD><CAB9>map<<3C><><EFBFBD><EFBFBD>, set<<3C>к<EFBFBD>>><3E>
// <20><><EFBFBD>ж<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
while (getline(in, line)) {
++line_number; // <20>к<EFBFBD><D0BA><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>ǰ<EFBFBD>в<EFBFBD><D0B2><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>ʣ<EFBFBD>ʹ<EFBFBD><CAB9>find_words<64><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD>split<69><74>
vector<string> words = find_words(line);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>е<EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>кŲ<D0BA><C5B2>뵽map<61><70>
for (vector<string>::const_iterator it = words.begin(); it != words.end(); ++it)
ret[*it].insert(line_number); // <20><><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>кŴ<D0BA><C5B4><EFBFBD>map
}
return ret; // <20><><EFBFBD><EFBFBD>map<61><70><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>к<EFBFBD>
}
int main()
{
// <20><><EFBFBD><EFBFBD>xref<65><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>ʹ<EFBFBD><CAB9>split<69><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ʲ<EFBFBD><CAB2>֣<EFBFBD><D6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>cin
map<string, set<int>> ret = xref(cin);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>к<EFBFBD>
for (map<string, set<int>>::const_iterator it = ret.begin(); it != ret.end(); ++it) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
cout << it->first << " occurs on line(s): ";
// <20><><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>ʳ<EFBFBD><CAB3>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD>
set<int>::const_iterator line_it = it->second.begin();
cout << *line_it; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>к<EFBFBD>
++line_it;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD>
while (line_it != it->second.end()) {
cout << ", " << *line_it;
++line_it;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD>Էָ<D4B7>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD>
cout << endl;
}
return 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}