http://www.stroustrup.com/Programming/PPP2code/std_lib_facilities.h
Chapter 9 // Exercise 3
Replace Name_pair::print() with a (global) operator << and define == and != for Name_pairs.
The most challenging part of this was getting the ostream operator to work properly. At the moment he's only shown examples for having it outside of the class but I'm pretty sure there is a way to have it inside the class as a member.
Also, he didn't particularly specify what type of == and != he wanted. Was to compare the name_pair in general or to compare specific days? I did it generally, however it could be improved to compare specific days and ages.
#include "stdafx.h"
#include "std_lib_facilities.h"
class Name_pairs
{
private:
vector<string> name;
vector<double> age;
public:
void read_names(int iterator); //read in a series of names
void read_ages(); //read in age for name
void sortNP(); //sort the vectors alphabetically by name
vector<string> getNames() { return name; }
vector<double> getAges() { return age; }
};
ostream& operator<<(ostream& os, Name_pairs& n) //print the vectors
{
cout << endl;
for (int i = 0; i < n.getNames().size(); ++i)
os << "Name: " << n.getNames()[i] << " Age: " << n.getAges()[i] << endl;
return os;
}
//equals
bool operator==(Name_pairs& a, Name_pairs& b)
{
return a.getNames() == b.getNames() &&
a.getAges() == b.getAges();
}
//not equals
bool operator!=(Name_pairs& a, Name_pairs& b)
{
return !(a == b);
}
void Name_pairs::read_names(int iterator)
{
string names;
for (int i = 0; i < iterator; ++i)
{
cout << "Name: ";
cin >> names;
name.push_back(names);
cout << endl;
}
}
void Name_pairs::read_ages()
{
double ages;
for (int i = 0; i < name.size(); ++i)
{
cout << "Age for " << name[i] << ": ";
cin >> ages;
age.push_back(ages);
cout << endl;
}
}
void Name_pairs::sortNP()
{
vector<string> name_copy = name;
vector<double> age_copy = age;
sort(name.begin(), name.end()); //sort actual names
//go through each member of sorted name
for (int i = 0; i < name.size(); ++i)
{
//go through each member of original copy name
for (int j = 0; j < name.size(); ++j)
{
//if sorted name matches original
if (name[i] == name_copy[j])
{
//assign original age to new position to match sorted vector
age[i] = age_copy[j];
}
}
}
}
int main()
{
cout << "How many names to read in? > ";
int howMany;
cin >> howMany;
Name_pairs namePair;
//read in names
namePair.read_names(howMany);
//read in ages
namePair.read_ages();
//print
cout << namePair;
//sort namePair alphabetically
namePair.sortNP();
//print
cout << namePair;
keep_window_open();
return 0;
}
The most challenging part of this was getting the ostream operator to work properly. At the moment he's only shown examples for having it outside of the class but I'm pretty sure there is a way to have it inside the class as a member.
Also, he didn't particularly specify what type of == and != he wanted. Was to compare the name_pair in general or to compare specific days? I did it generally, however it could be improved to compare specific days and ages.
No comments:
Post a Comment