📄 ex10_19.cpp
字号:
/* Code for exercise 10.19.
|
| "C++ Solutions--Companion to The C++ Programming Language, Third Edition"
| by David Vandevoorde; Addison-Wesley 1998; ISBN 0-201-30965-3.
|
| Permission to use, copy, modify, distribute and sell this software
| and its documentation for any purpose is hereby granted without fee.
| The author makes no representations about the suitability of this
| software for any purpose. It is provided "as is" without express or
| implied warranty.
`----------------------------------------------------------------------*/
/* Notes:
Older versions of the standard library do not have a header
<sstream>. Usually they have a header <strstream.h> instead,
but some work is required to make this program work with
that header. In particular, the line:
std::istringstream words(line);
would have to be replaced by:
::istrstream words(line.cstr());
*/
#include <algorithm>
#include <iostream>
#include <iterator>
#include <map>
#include <sstream>
#include <string>
#include <vector>
using std::istream;
using std::string;
using std::vector;
typedef std::map<string, vector<int> > LineIndex;
typedef vector<string>::const_iterator EntryIt;
LineIndex* make_line_index(istream &input,
vector<string> const &entries) {
// First create the index and enter the entries in it:
LineIndex *index = new LineIndex;
for (EntryIt p = entries.begin(); p!=entries.end(); ++p)
(*index)[*p]; // Causes insertion
// Now, read one line at a time:
string line, word;
int line_number = 0;
while (std::getline(input, line)) {
++line_number;
std::istringstream words(line);
// Read each word in this line and update the index if needed:
while (words >> word) {
LineIndex::iterator p = index->find(word);
if (p!=index->end()) // Found?
(*p).second.push_back(line_number);
}
}
return index;
}
int main(int argc, char *argv[]) {
// Words to look up: argv[1..argc-1]
// Enter them in a vector:
vector<string> entries;
for (int k = 1; k!=argc; ++k)
entries.push_back(string(argv[k]));
// Compute the index using the above function:
LineIndex *index = make_line_index(cin, entries);
// Output the results:
vector<string>::iterator p = entries.begin();
for (; p!=entries.end(); ++p) {
cout << "Word " << *p << " appears in lines ";
LineIndex::iterator lines = index->find(*p);
std::copy((*lines).second.begin(), (*lines).second.end(),
ostream_iterator<int>(cout, ", "));
cout << ".\n";
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -