#include <iostream> #include <map> #include <string> using std::cin; using std::cout; using std::endl; using std::map; using std::string; int main() { string s; map<string, int> counters; // store each word and an associated counter // read the input, keeping track of each word and how often we see it while (cin >> s) ++counters[s]; // write the words and associated counts for (map<string, int>::const_iterator it = counters.begin(); it != counters.end(); ++it) { cout << it->first << "\t" << it->second << endl; } return 0; }
#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; }
#include <iostream> #include <vector> #include <string> #include <map> #include <fstream> #include <stdexcept> #include <iomanip> using std::string; using std::map; using std::vector; using std::ifstream; using std::invalid_argument; using std::cerr; using std::cout; using std::endl; using std::setw; const string dictionary_file = "/usr/share/dict/words"; string lowercase(const string &str) { string ret; string::const_iterator it; for (it = str.begin(); it != str.end(); it++) ret += tolower(*it); return ret; } map<string, bool> read_dictionary() { ifstream in(dictionary_file.c_str()); map<string, bool> dictionary; if (! in) throw invalid_argument("Invalid: \"" + dictionary_file + "\""); string word; while (in >> word) dictionary[lowercase(word)] = true; return dictionary; } void strip_non_chars(string &word) { string::iterator it = word.begin(); while (it != word.end()) { if (!isalpha(*it)) { it = word.erase(it); } else { ++it; } } } map<string, int> spell_check_file(const char *file, const map<string, bool> &dictionary) { ifstream in(file); if (! in) throw invalid_argument("Invalid file \"" + string(file) + "\""); string word; map<string, int> misspellings; while (in >> word) { strip_non_chars(word); if (word.empty()) continue; if (dictionary.find(lowercase(word)) == dictionary.end()) misspellings[word] ++; } return misspellings; } int main(int argc, char **argv) { if (argc != 2) { cerr << "Must specify a file name" << endl; return -1; } try { map<string, bool> dict = read_dictionary(); map<string, int> misspellings = spell_check_file(argv[1], dict); map<string, int>::const_iterator it; for (it = misspellings.begin(); it != misspellings.end(); it++) { cout << setw(15) << it->first << " was misspelled " << it->second << " time" << (it->second == 1 ? "" : "s") << endl; } } catch (invalid_argument e) { cerr << e.what() << endl; return -1; } }
median
function
template <class T> T median(vector<T> v) { typedef typename vector<T>::size_type vec_sz; vec_sz size = v.size(); if (size == 0) throw domain_error("median of an empty vector"); sort(v.begin(), v.end()); vec_sz mid = size/2; return size % 2 == 0 ? (v[mid] + v[mid-1]) / 2 : v[mid]; }
Last modified: Fri Mar 7 13:11:27 2003