http://www.stroustrup.com/Programming/PPP2code/std_lib_facilities.h
Chapter 8 // Exercise 13
13. Write a function that takes a vector<string> argument and returns a vector<int> containing the number of characters in each string. Also find the longest and the shortest string and the lexicographically first and last string. How many separate functions would you use for these tasks? Why?
You could do separate functions for every task, for example, a function that only finds the longest string and a function that only finds the shortest string however, to save on code and efficiency, I decided to return these values as vectors. That way we know that the vectors (apart from number of chars in a string) will only ever have 2 values in them; the largest followed by the smallest and the first alphabetical word followed by the last. There should technically be separate print functions however we know exactly what the size of 2 vectors will be, so I consider it OK to directly access the items in them.
#include "stdafx.h" #include "std_lib_facilities.h" void print(const vector<int>& vInt, const vector<string>& vStr1, const vector<string>& vStr2) { cout << "Chars in each string: "; for (int i = 0; i < vInt.size(); ++i) cout << vInt[i] << " "; cout << "\n\nLongest String: " << vStr1[0] << endl; cout << "\nSmallest String: " << vStr1[1] << endl; cout << "\nAlphabetically First Word: " << vStr2[0] << endl; cout << "\nAlphabetically Last Word: " << vStr2[1] << '\n' << endl; } //number of characters in each string vector<int> findNumChars(const vector<string>& v) { vector<int> numChar; for (int i = 0; i < v.size(); ++i) { //push back size of each string numChar.push_back(v[i].size()); } return numChar; } //find longest&shortest string in vector vector<string> findMinMax(const vector<string>& v) { vector<string> minMax; int largest = v[0].size(); int smallest = v[0].size(); int iterator1 = 0; int iterator2 = 0; //to pushback correct items from vector for (int i = 0; i < v.size(); ++i) { //if largest is smaller than value, make that new largest if (largest < v[i].size()) { largest = v[i].size(); iterator1 = i; } //if smallest is bigger than value, make that new smallest if (smallest > v[i].size()) { smallest = v[i].size(); iterator2 = i; } } minMax.push_back(v[iterator1]); //push back largest string minMax.push_back(v[iterator2]); //push back smallest string return minMax; } //find alphabetically first and last string vector<string> findAlphaB(vector<string> v_copy) { vector<string> alpha; //sort the copy to be in alphabetical order sort(v_copy.begin(), v_copy.end()); alpha.push_back(v_copy[0]); alpha.push_back(v_copy[v_copy.size() - 1]); return alpha; } int main() { vector<string> words = { "keyboard", "cat", "nyan", "cat", "tank", "cat", "hipster", "kitty", "grumpy", "cat" }; //find number of character in each string vector<int> numChar = findNumChars(words); //find largest and shortest strings vector<string> minMax = findMinMax(words); //find alphabetically first and last string vector<string> alphaB = findAlphaB(words); //print results print(numChar, minMax, alphaB); keep_window_open(); return 0; }
You could do separate functions for every task, for example, a function that only finds the longest string and a function that only finds the shortest string however, to save on code and efficiency, I decided to return these values as vectors. That way we know that the vectors (apart from number of chars in a string) will only ever have 2 values in them; the largest followed by the smallest and the first alphabetical word followed by the last. There should technically be separate print functions however we know exactly what the size of 2 vectors will be, so I consider it OK to directly access the items in them.
No comments:
Post a Comment