#include
<
iostream
>
#include < string >
#include < fstream >
#include < vector >
#include < algorithm >
using namespace std;
struct Review ... {
std::string title;
int rating;
} ;
bool operator < ( const Review & r1, const Review & r2);
bool worseThan( const Review & r1, const Review & r2);
// bool FillReview(Review & rr);
void ShowReview( const Review & rr);
bool FillReview(Review & rr, ifstream & fin);
int main()
... {
ifstream fin;
fin.open("test.txt");
if(!fin.is_open())
...{
cerr<<"can't open the file!"<< endl;
return 0;
}
vector<Review> books;
Review temp;
while (FillReview(temp,fin))
books.push_back(temp);
fin.close();
cout << "Thank you. You entered the following "
<< books.size() << " ratings: "
<< "Rating Book ";
for_each(books.begin(), books.end(), ShowReview);
sort(books.begin(), books.end());
cout << "Sorted by title: Rating Book ";
for_each(books.begin(), books.end(), ShowReview);
sort(books.begin(), books.end(), worseThan);
cout << "Sorted by rating: Rating Book ";
for_each(books.begin(), books.end(), ShowReview);
random_shuffle(books.begin(), books.end());
cout << "After shuffling: Rating Book ";
for_each(books.begin(), books.end(), ShowReview);
cout << "Bye. ";
return 0;
}
bool operator < ( const Review & r1, const Review & r2)
... {
if (r1.title < r2.title)
return true;
else if (r1.title == r2.title && r1.rating < r2.rating)
return true;
else
return false;
}
bool worseThan( const Review & r1, const Review & r2)
... {
if (r1.rating < r2.rating)
return true;
else
return false;
}
bool FillReview(Review & rr)
... {
std::cout << "Enter book title (quit to quit): ";
std::getline(std::cin,rr.title);
if (rr.title == "quit")
return false;
std::cout << "Enter book rating: ";
std::cin >> rr.rating;
if (!std::cin)
return false;
std::cin.get();
return true;
}
void ShowReview( const Review & rr)
... {
std::cout << rr.rating << " " << rr.title << std::endl;
}
bool FillReview(Review & rr,ifstream & fin)
... {
if(!fin)
return false;
getline(fin,rr.title,';');
if(rr.title == "")
return false;
string rating;
getline(fin,rating,';');
rr.rating = atoi(rating.c_str());
return true;
}
#include < string >
#include < fstream >
#include < vector >
#include < algorithm >
using namespace std;
struct Review ... {
std::string title;
int rating;
} ;
bool operator < ( const Review & r1, const Review & r2);
bool worseThan( const Review & r1, const Review & r2);
// bool FillReview(Review & rr);
void ShowReview( const Review & rr);
bool FillReview(Review & rr, ifstream & fin);
int main()
... {
ifstream fin;
fin.open("test.txt");
if(!fin.is_open())
...{
cerr<<"can't open the file!"<< endl;
return 0;
}
vector<Review> books;
Review temp;
while (FillReview(temp,fin))
books.push_back(temp);
fin.close();
cout << "Thank you. You entered the following "
<< books.size() << " ratings: "
<< "Rating Book ";
for_each(books.begin(), books.end(), ShowReview);
sort(books.begin(), books.end());
cout << "Sorted by title: Rating Book ";
for_each(books.begin(), books.end(), ShowReview);
sort(books.begin(), books.end(), worseThan);
cout << "Sorted by rating: Rating Book ";
for_each(books.begin(), books.end(), ShowReview);
random_shuffle(books.begin(), books.end());
cout << "After shuffling: Rating Book ";
for_each(books.begin(), books.end(), ShowReview);
cout << "Bye. ";
return 0;
}
bool operator < ( const Review & r1, const Review & r2)
... {
if (r1.title < r2.title)
return true;
else if (r1.title == r2.title && r1.rating < r2.rating)
return true;
else
return false;
}
bool worseThan( const Review & r1, const Review & r2)
... {
if (r1.rating < r2.rating)
return true;
else
return false;
}
bool FillReview(Review & rr)
... {
std::cout << "Enter book title (quit to quit): ";
std::getline(std::cin,rr.title);
if (rr.title == "quit")
return false;
std::cout << "Enter book rating: ";
std::cin >> rr.rating;
if (!std::cin)
return false;
std::cin.get();
return true;
}
void ShowReview( const Review & rr)
... {
std::cout << rr.rating << " " << rr.title << std::endl;
}
bool FillReview(Review & rr,ifstream & fin)
... {
if(!fin)
return false;
getline(fin,rr.title,';');
if(rr.title == "")
return false;
string rating;
getline(fin,rating,';');
rr.rating = atoi(rating.c_str());
return true;
}
for_each()函数可用来替换for循环
vector<Review>::iterator pr;
for(pr = books.begin(); pr!=books.end(); pr++)
showReview(*pr);
替换为:
for_each(book.begin(),book.end(),ShowReview);
ShowReview原型
void ShowReview(const Review& rr)
最后一个参数是函数对象,它不改变参数的值。
test.txt
abc;100;bdf;39;ffff;453;zzz;789;