Problem
Output
/*
// Given two lists of strings build a new list that has all strings that appear in both the original lists. If the same string appears more than once output it as many times as it appears in both lists
//
// Example:
// "dog", "bird", "elephant", "dog", "dog", "cat"
// "cat", "dog", "dog", "cat", "cat", "fish"
// Result (order doesn't matter)
// "dog", "dog", "cat"
*/
Solution
#include <iostream>
#include <list>
#include <iterator>
#include <algorithm>
#include <string>
using namespace std;
void find_comm_strings(list<string>& output, list<string>& listA, list<string>& listB)
{
listA.sort();
listB.sort();
list<string>::const_iterator citA = listA.begin();
list<string>::const_iterator citB = listB.begin();
while(citA != listA.end() && citB != listB.end()){
int eq = (*citA).compare(*citB);
if(eq == 0){
output.push_back(*citA);
citA ++;
citB ++;
}
else if (eq > 0){
citB ++;
}
else{
citA ++;
}
}
}
int main(int argc, char* argv[])
{
list<string> listA;
list<string> listB;
list<string> output;
cout << "list A:" << endl;
listA.push_back("dog");
listA.push_back("bird");
listA.push_back("elephant");
listA.push_back("dog");
listA.push_back("dog");
listA.push_back("cat");
copy(listA.begin(), listA.end(), ostream_iterator<string>(cout, ","));
cout << endl;
cout << "list B:" << endl;
listB.push_back("cat");
listB.push_back("dog");
listB.push_back("dog");
listB.push_back("cat");
listB.push_back("cat");
listB.push_back("fish");
copy(listB.begin(), listB.end(), ostream_iterator<string>(cout, ","));
cout << endl;
find_comm_strings(output, listA, listB);
cout << "common strings" << endl;
copy(output.begin(), output.end(), ostream_iterator<string>(cout, ","));
cout << endl;
return 0;
}
Output
list A:
dog,bird,elephant,dog,dog,cat,
list B:
cat,dog,dog,cat,cat,fish,
common strings
cat,dog,dog,
Press any key to continue . . .