本文共 11282 字,大约阅读时间需要 37 分钟。
习题答案目录:
第11章 关联容器
练习11.3
#include #include #include
练习11.4
#include #include #include
练习11.7
#include
练习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
练习11.15
mapped_type 是vector
key_type 是int
value_type 是pair<int,vector>
练习11.16
#include
练习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
之前的更容易阅读和编写。
练习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
练习11.28
#include #include #include #include
> 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
练习11.32
#include #include
练习11.33
#include #include #include
练习11.34
下标操作,当元素不存在时会隐式地创建一个新元素插入到map中,修改了map
练习11.35
如果有重复的key,则下标表示时新的会替换旧的,而insert不会,那么在transform函数中find会有多个返回值导致出错。
练习11.36
#include #include #include
练习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;}