Exercise 4-5
Write a function that reads words from an input stream and stores them in a vector. Use that function both to write programs that count the number of words in the input, and to count how many times each word occurred.
Solution
This is a somewhat simplified version of Solution to Exercise 4-0, in the sense that 4-0 processes the std::vector<Student_Info> container, whereas 4-5 deals processes the std::vector<std::string> container.
Solution Strategy
- Create a readWords function to parse individual std::string objects (i.e. words) to a std::vector<std::string> container wordList. We can reuse the skeleton logic from the std::istream& read_hw function defined in the Solution to Exercise 4-0.
- The word count is essentially the number of elements within the wordList container. i.e. wordList.size(). Though not strictly neccessary, I have created a function called countWords which does the same thing.
- Create a countUniqueWords function to calculate the number of unique words within the container. We can reuse the skeleton logic from the Solution to Exercise 3-3.
- Invoke these functions via the main program.
The Project
As usual, I partition the program into smaller chunks – i.e. in C++ source files and header files.
C++ Source Files
- main.cpp – this is the first program that is run during the implementation phase.
- readWords.cpp – contains all functions relating to creating and processing the std::vector<std::string> container.
C++ Header Files
- readWords.h– declare the functions as defined in readWords.cpp.
This diagram below shows what the Code::Block Management Tree look like after successful creation of these files.
Source Files
main.cpp
#include <iostream> #include "readWords.h" using std::cin; using std::cout; using std::endl; using std::vector; using std::string; int main() { vector<string> wordList; readWords(cin, wordList); displayWords(wordList); cout << "No. Words = " << countWords(wordList) << endl; cout << "No. Unique Words = " << countUniqueWords(wordList) << endl; return 0; }
readWords.cpp
#include "readWords.h" #include <algorithm> using std::vector; using std::string; using std::istream; using std::cout; using std::endl; using std::sort; // read string objects one-by-one, and append to a vector<string> container // note: I reuse the Student_info.cpp from the Solution to Exercise 4-0 istream& readWords(istream& in, vector<string>& words) { if (in) { // get rid of previous contents words.clear(); // read input string one by one, and append to vector<string> container string x; while (in >> x) words.push_back(x); // clear the stream error status (if any) so that input will work for the next set of inputs in.clear(); } return in; } // function to display the elements within the vector<string> container int displayWords(const vector<string>& words) { for (vector<string>::size_type i = 0; i != words.size(); ++i) cout << words[i] << endl; return 0; } // function to count elements within a vector<string> container int countWords(const vector<string>& words) { return words.size(); } // function to count unique elements within a vector<string> container // note: borrowed from the solution to exercise 3-3 int countUniqueWords(const vector<string>& words) { vector<string> tmpWords = words; typedef vector<string>::size_type vec_sz; const vec_sz numElements = tmpWords.size(); if (numElements == 0) return 0; else if (numElements == 1) return 1; sort(tmpWords.begin(),tmpWords.end()); const vec_sz numLoops = numElements - 1; vec_sz A = 0; vec_sz B = 1; int numUniqueWords = 1; for (vec_sz i = 0; i != numLoops; ++i) { if (tmpWords[B] != tmpWords[A]) ++numUniqueWords; ++A; ++B; } return numUniqueWords; }
Header Files
readWords.h
#ifndef GUARD_READWORDS_H #define GUARD_READWORDS_H #include <iostream> #include <vector> #include <string> std::istream& readWords(std::istream&, std::vector<std::string>&); int displayWords(const std::vector<std::string>&); int countWords(const std::vector<std::string>&); int countUniqueWords(const std::vector<std::string>&); #endif // GUARD_READWORDS
Result
Test 1 – Supply 0 Words
^Z No. Words = 0 No. Unique Words = 0
Test 2 – Supply 1 Word
aaa ^Z aaa No. Words = 1 No. Unique Words = 1
Test 3 – Supply Multiple Words
aaa bbb ccc ddd aaa bbb aaa ^Z aaa bbb ccc ddd aaa bbb aaa No. Words = 7 No. Unique Words = 4
this is not complete… The assignment was also to count how many times each word occurred.
btw… why did you do
int countUniqueWords(const vector& words)
{
vector tmpWords = words;
[…]
instead of :
int countUniqueWords(const vector words)