Re: Questions with Accelerated C++ exercises of chapter 7
On Apr 23, 12:15 pm, Lambda <stephenh...@gmail.com> wrote:
7-4 The input file is a novel. There are more than 4, 000 'the' in the
text.
Breaking up the output will help? How to break up the output? Add
newlines?
7-5 Why use list? I can't see any benefit. List does not support
random accesses.
And there are several vectors:
Rule, Rule_collection, vector contains words the input split into,
vector populated by gen_aux, and vector gen_sentence returned
Which one should I replace with list?
7-9 It's a difficult one as author said.I have no idea.
7-4 The output produce by the cross-reference program will be ungainly
if the input file is large. Rewrite the program to break up the output
if the lines get too long.
Original code:
#include <map>
#include <iostream>
#include <string>
#include <vector>
#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<string, vector<int> >
xref(istream& in,
vector<string> find_words(const string&) = split)
{
string line;
int line_number = 0;
map<string, vector<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
for (vector<string>::const_iterator it = words.begin();
it != words.end(); ++it)
ret[*it].push_back(line_number);
}
return ret;
}
int main()
{
// call `xref' using `split' by default
map<string, vector<int> > ret = xref(cin);
// write the results
for (map<string, vector<int> >::const_iterator it = ret.begin();
it != ret.end(); ++it) {
// write the word
cout << it->first << " occurs on line(s): ";
// followed by one or more line numbers
vector<int>::const_iterator line_it = it->second.begin();
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;
}