c++学习11

// 定义一个vector容器,存储在未来6个月里要阅读的书的名字,
// 定义一个set,用于记录已经看过的书名。
// 本程序支持从vector中选择一本没有读过而现在要读的书,
// 并将该书名放入记录已读书目的set中,
// 并且支持从已读书目的set中删除该书的记录。

// 在虚拟的6个月后,输出已读书目和还没有读的书目

#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将其删除。
// 当所寻找的元素不存在时,程序依然能正确执行

#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操
作,从而保证当所寻找的元素不存在时,程序依然能正确执行。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值