博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++Primer第五版——习题答案详解(十)
阅读量:5122 次
发布时间:2019-06-13

本文共 11282 字,大约阅读时间需要 37 分钟。


习题答案目录:

第11章 关联容器


练习11.3

#include
#include
#include
using namespace std;int main() { string s; map
num; cout << "输入单词表:" << endl; while (cin >> s) { ++num[s]; } for (const auto &i : num) { cout << i.first << " occurs " << i.second << ((i.second > 1) ? " times" : " time") << endl; } system("pause"); return 0;}

练习11.4

#include
#include
#include
#include
using namespace std;void process(string &s) { for (auto i = 0;i < s.size(); ++i) { if (isupper(s[i])) s[i] = tolower(s[i]); else if (ispunct(s[i])) { s.erase(i,1); } }}int main() { string s; map
num; cout << "输入单词表:" << endl; while (cin >> s) { process(s); ++num[s]; } for (const auto &i : num) { cout << i.first << " occurs " << i.second << ((i.second > 1) ? " times" : " time") << endl; } system("pause"); return 0;}

练习11.7

#include#include
#include
#include
using namespace std;int main() { map
> mp; string last_name, first_name; cout << "输入姓:" << endl; cin >> last_name; cout << "输入该姓的成员名字:" << endl; while (cin >> first_name) { mp[last_name].push_back(first_name); } for (const auto i : mp) { cout << "姓:" << i.first << " 有以下成员:" << endl; for (const auto j : i.second) { cout << j << " "; } cout << endl; } system("pause"); return 0;}

练习11.8

#include
#include
#include
using namespace std;int main() { vector
v = { 1,1,2,3,4,4,5,6 }; auto iter = unique(v.begin(), v.end()); v.erase(iter, v.end()); for (auto i : v) { cout << i << " "; } cout << endl; system("pause"); return 0;}

练习11.9

map
> mp;

练习11.10

vector可以,因为定义了比较大小的操作,list未定义所以不行。

练习11.11

using compareType = bool (*)(const Sales_data& lhs, const Sales_data& rhs);

练习11.12

#include
#include
#include
#include
using namespace std;int main() { vector
> vec; size_t i = 0; string s; int num; while (cin >> s >> num) { vec.push_back({ s,num }); ++i; } for (auto i : vec) { cout << i.first << " " << i.second << endl; } system("pause"); return 0;}

练习11.13

#include
#include
#include
#include
using namespace std;int main() { vector
> vec; size_t i = 0; string s; int num; while (cin >> s >> num) { //vec.push_back({ s,num }); 第一种 vec.emplace_back(s, num); //第二种:最简便 //vec.push_back(make_pair(str,i));//第三种 ++i; } for (auto i : vec) { cout << i.first << " " << i.second << endl; } system("pause"); return 0;}

练习11.14

#include#include
#include
#include
#include
using namespace std;int main() { map
>> mp; string last_name, first_name, birthday; cout << "输入姓:" << endl; cin >> last_name; cout << "输入该姓的成员名字和生日:" << endl; while (cin >> first_name >> birthday) { mp[last_name].emplace_back(first_name, birthday); } for (const auto i : mp) { cout << "姓:" << i.first << " 有以下成员:" << endl; for (const auto j : i.second) { cout << j.first << " " << j.second << endl; } cout << endl; } system("pause"); return 0;}

练习11.15

mapped_type 是vector
key_type 是int
value_type 是pair<int,vector>

练习11.16

#include#include
#include
using namespace std;int main() { map
mp; mp["aaa"] = 1; auto iter = mp.begin(); iter->second = 2; //iter->first = "bbb"; const 不允许修改 cout << iter->first << " " << iter->second << endl; system("pause"); return 0;}

练习11.17

第三个不合法,back_inserter()需要用到push_back(),而set没有;其余合法。

练习11.18

map
::iterator

练习11.19

using compareType = bool (*)(const Sales_data &lhs, const Sales_data &rhs);multiset
bookstore(compareIsbn);multiset
::iterator c_it = bookstore.begin();

练习11.20

#include
#include
#include
using namespace std;int main() { map
word_count; string word; while (cin >> word) { auto ret = word_count.insert({ word,1 }); if (!ret.second) { ++ret.first->second; } } for (auto i : word_count) { cout << i.first << " " << i.second << endl; } system("pause"); return 0;}

之前的更容易阅读和编写。

练习11.21

word_count.insert({ word,0 }) //得到insert的返回值,是一个pairword_count.insert({ word,0 }).first //是pair的第一个成员,是一个map迭代器,指向具有给定关键字的元素word_count.insert({ word,0 }).first -> //解引用此迭代器,提取map中的元素,元素也是一个pairword_count.insert({ word,0 }).first -> second //map中元素的值部分++word_count.insert({ word,0 }).first->second //递增此值

练习11.23

#include#include
#include
#include
using namespace std;int main() { multimap
> mp; vector
vs; string last_name, first_name; cout << "总共有几个姓:" << endl; int n, k = 1; cin >> n; while (n--) { cout << "请输入第" << k << "个姓:" << endl; cin >> last_name; cout << "请输入姓" << last_name << "的成员,并以 END 结束当前输入" << endl; while (cin >> first_name) { if(first_name!="END") vs.push_back(first_name); else break; } mp.insert({ last_name,vs }); k++; } for (const auto i : mp) { cout << "姓:" << i.first << " 有以下成员:"; for (const auto j : i.second) { cout << j << " "; } cout << endl; } system("pause"); return 0;}

练习11.28

#include
#include
#include
#include
using namespace std;int main() { map
> mp = { { "aa",{1,2,3,4} } }; auto iter = mp.find("aa"); cout << iter->first << endl; system("pause"); return 0;}

练习11.29

upper_bound和lower_bound返回相等的迭代器——指向一个不影响排序的关键字插入位置。

练习11.30

第一个迭代器引用后得到书名。

练习11.31

#include
#include
#include
using namespace std;int main() { string search_item = "bbb"; multimap < string, string > mp = { {"John", "aaa"}, { "John","bbb" }, { "John","ccc" },{"Tom","ddd"} }; auto iter = mp.find("John"); auto num = mp.count("John"); while (num) { if (iter->second == search_item) { mp.erase(iter); break; } ++iter; --num; } for (auto i : mp) { cout << i.first << " " << i.second << endl; } system("pause"); return 0;}

练习11.32

#include
#include
#include
#include
using namespace std;int main() { string search_item = "bbb"; multimap < string, string > mp = { {"John", "baa"}, { "John","abb" }, { "John","ced" },{"Tom","ccc"},{"Bob","zzz"},{"Bob","aae"} }; map
> ans; for (auto i : mp) { ans[i.first].insert(i.second); } for (auto i : ans) { cout << i.first << " : "; for (auto j : i.second) { cout << j << " "; } cout << endl; } system("pause"); return 0;}

练习11.33

#include
#include
#include
#include
#include
using namespace std;//函数buildMap读入给定文件,建立起转换映射map
buildMap(ifstream &map_file) { map
trans_map; string key; string value; //读取第一个单词存入key中,行中剩余内容存入value while (map_file >> key && getline(map_file, value)) { if (value.size() > 1) { trans_map[key] = value.substr(1); //跳过前导空格 } else { throw runtime_error("no rule for " + key); } } return trans_map;}//生成文本转换const string & transform(const string &s, const map
&m) { auto map_it = m.find(s); if (map_it != m.cend()) { return map_it->second; } else { return s; }}void word_transform(ifstream &map_file, ifstream &input) { auto trans_map = buildMap(map_file);//保存转换规则 string text; while (getline(input, text)) { istringstream stream(text); //读取每个单词 string word; bool firstword = true; //控制是否打印空格 while (stream >> word) { if (firstword) { firstword = false; } else cout << " "; //transform返回它的第一个参数或其转换之后的形式 cout << transform(word, trans_map); } cout << endl; }}int main() { ifstream map_file("book.txt"), input("test.txt"); word_transform(map_file, input); system("pause"); return 0;}

练习11.34

下标操作,当元素不存在时会隐式地创建一个新元素插入到map中,修改了map

练习11.35

如果有重复的key,则下标表示时新的会替换旧的,而insert不会,那么在transform函数中find会有多个返回值导致出错。

练习11.36

#include
#include
#include
#include
#include
using namespace std;//函数buildMap读入给定文件,建立起转换映射map
buildMap(ifstream &map_file) { map
trans_map; string key; string value; //读取第一个单词存入key中,行中剩余内容存入value while (map_file >> key && getline(map_file, value)) { if (value.size() > 1) { trans_map[key] = value.substr(1); //跳过前导空格 } else { throw runtime_error("no rule for " + key); } } return trans_map;}//生成文本转换const string & transform(const string &s, const map
&m) { auto map_it = m.find(s); if (map_it != m.cend()) { return map_it->second; } else { return s; }}void word_transform(ifstream &map_file, ifstream &input) { auto trans_map = buildMap(map_file);//保存转换规则 string text; while (getline(input, text)) { istringstream stream(text); //读取每个单词 string word; bool firstword = true; //控制首个空格 while (stream >> word) { if (firstword) { firstword = false; } else cout << " "; //transform返回它的第一个参数或其转换之后的形式 cout << transform(word, trans_map); } cout << endl; }}int main() { ifstream map_file("book.txt"), input("test.txt"); word_transform(map_file, input); system("pause"); return 0;}

练习11.37

无序容器不用排序,效率高。
有序容器可以自定义排序。

练习11.38

单词计数程序

#include 
#include
#include
using namespace std;int main(){ unordered_map
word_count; string word; while(cin >> word) ++word_count[word]; for(const auto &w : word_count) cout << w.first << "," << w.second << endl; return 0;}

单词转换程序

#include
#include
#include
#include
#include
using namespace std;//函数buildMap读入给定文件,建立起转换映射unordered_map
buildMap(ifstream &map_file) { unordered_map
trans_map; string key; string value; //读取第一个单词存入key中,行中剩余内容存入value while (map_file >> key && getline(map_file, value)) { if (value.size() > 1) { trans_map[key] = value.substr(1); //跳过前导空格 } else { throw runtime_error("no rule for " + key); } } return trans_map;}//生成文本转换const string & transform(const string &s, const unordered_map
&m) { auto map_it = m.find(s); if (map_it != m.cend()) { return map_it->second; } else { return s; }}void word_transform(ifstream &map_file, ifstream &input) { auto trans_map = buildMap(map_file);//保存转换规则 string text; while (getline(input, text)) { istringstream stream(text); //读取每个单词 string word; bool firstword = true; //控制首个空格 while (stream >> word) { if (firstword) { firstword = false; } else cout << " "; //transform返回它的第一个参数或其转换之后的形式 cout << transform(word, trans_map); } cout << endl; }}int main() { ifstream map_file("book.txt"), input("test.txt"); word_transform(map_file, input); system("pause"); return 0;}

转载于:https://www.cnblogs.com/Mered1th/p/10546136.html

你可能感兴趣的文章
c++ __int64
查看>>
IP封锁 (防火墙维护一张IP黑名单)
查看>>
【模板】trie树(字典树)
查看>>
JSON.stringify 语法实例讲解
查看>>
Python6 模块
查看>>
P3377 【模板】左偏树(可并堆)
查看>>
Djang 用户登录
查看>>
Java同步锁——lock与synchronized 的区别【转】
查看>>
Python--网络编程-----文件传输简单版本
查看>>
解决Ubuntu编译内核uImage出现问题“mkimage” command not found - U-Boot
查看>>
NOIP2018退役记
查看>>
Filter过滤器
查看>>
HTML5新标签在低版本浏览器中兼容性Checklist (hacks and issues)
查看>>
Laravel框架使用的一些注意细节(一)
查看>>
android-------非常好的图片加载框架和缓存库(Picasso)
查看>>
一次Redis 的性能测试和问题 [问题已经自己解决,见文章最后]
查看>>
原型模式(Prototype)
查看>>
Oracle数据库备份与恢复
查看>>
1007: [HNOI2008]水平可见直线
查看>>
网易2017校招编程题
查看>>