// 定義一個vector容器,存儲在未來6個月裡要閱讀的書的名字,
// 定義一個set,用於記錄已經看過的書名。
// 本程序支持從vector中選擇一本沒有讀過而現在要讀的書,
// 並將該書名放入記錄已讀書目的set中,
// 並且支持從已讀書目的set中刪除該書的記錄。
// 在虛擬的6個月後,輸出已讀書目和還沒有讀的書目
[cpp]
#include <iostream>
#include <set>
#include <vector>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
vector<string> books;
set<string> readedBooks;
string name;
// 建立保存未來6個月要閱讀的書名的vector對象
cout << "Enter names for books you'd like to read\(Ctrl+Z to end):"
<< endl;
while (cin >> name)
books.push_back(name);
cin.clear(); // 使流對象重新有效
bool timeOver = false;
string answer, bookName;
// 用當前系統時間設置隨機數發生器種子
srand( (unsigned)time( NULL ) );
// 模擬隨時間的流逝而改變讀書記錄
while (!timeOver && !books.empty()) {
// 時間未到6個月且還有書沒有讀過
cout << "Would you like to read a book?(Yes/No)" << endl;
cin >> answer;
if (answer[0] == 'y' answer[0] == 'Y') {
// 在vector中隨機選擇一本書
int i = rand() % books.size(); // 產生一個偽隨機數
bookName = books[i];
cout << "You can read this book: "
<< bookName << endl;
readedBooks.insert(bookName); // 將該書放入已讀集合
books.erase(books.begin() + i); // 從vector對象中刪除該書
cout << "Did you read it?(Yes/No)" << endl;
cin >> answer;
if (answer[0] == 'n' answer[0] == 'N') {
// 沒有讀這本書
readedBooks.erase(bookName); // 從已讀集合中刪除該書
books.push_back(bookName); // 將該書重新放入vector中
}
}
cout << "Time over?(Yes/No)" << endl;
cin >> answer;
if (answer[0] == 'y' answer[0] == 'Y') {
// 虛擬的6個月結束了
timeOver = true;
}
}
if (timeOver) {// 虛擬的6個月結束了
// 輸出已讀書目
cout << "books read:" << endl;
for (set<string>::iterator sit = readedBooks.begin();
sit != readedBooks.end(); ++sit)
cout << *sit << endl;
// 輸出還沒有讀的書目
cout << "books not read:" << endl;
for (vector<string>::iterator vit = books.begin();
vit != books.end(); ++vit)
cout << *vit << endl;
}
else
cout << "Congratulations! You have read all these books."<<endl;
return 0;
}
// 建立作者及其作品的multimap容器。
// 使用find 函數在multimap中查找元素,並調用erase將其刪除。
// 當所尋找的元素不存在時,程序依然能正確執行
[cpp]
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
multimap<string, string> authors;
string author, work, searchItem;
// 建立作者及其作品的multimap容器
do {
cout << "Enter author name(Ctrl+Z to end):" << endl;
cin >> author;
if (!cin)
break;
cout << "Enter author's works(Ctrl+Z to end):" << endl;
while (cin >> work)
authors.insert(make_pair(author, work));
cin.clear();// 讀入了一位作者的所有作品後使流對象重新有效
}while (cin);
cin.clear(); // 使流對象重新有效
// 讀入要找的作者
cout << "Who is the author that you want erase:" << endl;
cin >> searchItem;
// 找到該作者對應的第一個元素
multimap<string,string>::iterator iter =
authors.find(searchItem);
if (iter != authors.end())
// 刪除該作者的所有作品
authors.erase(searchItem);
else
cout << "Can not find this author!" << endl;
// 輸出multimap對象
cout << "author\t\twork:" << endl;
for (iter = authors.begin(); iter != authors.end(); ++iter)
cout << iter->first << "\t\t" << iter->second << endl;
return 0;
}
對find函數所返回的迭代器進行判斷,當該迭代器指向authors中的有效元素時才進行erase操
作,從而保證當所尋找的元素不存在時,程序依然能正確執行。