您的位置:首页 > 编程语言 > C语言/C++

C++Primer第五版 第十一章习题答案(31~38)

2017-03-02 09:34 357 查看
31:知识点:在multimap中,具有相同关键字的元素会相邻存储

#include<iostream>
#include<string>
#include<fstream>
#include<list>
#include<vector>
#include<map>
#include<set>
#include<cctype>//ctype无法打开,包含tolower()函数和ispunct函数
#include<algorithm>
#include<utility>//保存pair的头文件
using namespace std;

int main(int argc, char**argv)
{
string author = "机械先驱";
multimap<string, string> Library;
Library.insert(make_pair(author,"灭世者的帽子"));
Library.insert(make_pair(author,"法穿杖"));
Library.insert(make_pair(author,"法穿鞋"));
Library.insert(make_pair(author,"冰杖"));
Library.insert(make_pair(author,"巫妖之祸"));
Library.insert(make_pair(author,"海克斯科技核心"));

auto it1 = Library.find(author); //返回第一个关键字为author的迭代器
auto it2 = Library.count(author);//返回关键词为author的元素数量

while (it2)
{
if (it1->second == "海克斯科技核心")
{
Library.erase(it1);//直接删除此关键字值对,传入参数为指向它的迭代器
break;//需要,不然下面调用到已经删除的迭代器,会出粗
}
++it1;
--it2;
}

multimap<string,string>::iterator it3 = Library.begin();
for (it3; it3 != Library.end(); ++it3)
{
cout<<it3->first<<"的宝贝儿:"<<it3->second<<endl;
}

return 0;
}


32:知识点:对于set,系统能根据元素的值自动进行排序

#include<iostream>
#include<string>
#include<fstream>
#include<list>
#include<vector>
#include<map>
#include<set>
#include<cctype>//ctype无法打开,包含tolower()函数和ispunct函数
#include<algorithm>
#include<utility>//保存pair的头文件
using namespace std;

int main(int argc, char**argv)
{
string author = "机械先驱";
string author1 = "卡牌大师";
multimap<string, string> Library;
Library.insert(make_pair(author1,"灭世者的帽子"));
Library.insert(make_pair(author,"法穿杖"));
Library.insert(make_pair(author1,"法穿鞋"));
Library.insert(make_pair(author,"冰杖"));
Library.insert(make_pair(author,"巫妖之祸"));
Library.insert(make_pair(author,"海克斯科技核心"));

auto it1 = Library.find(author); //返回第一个关键字为author的迭代器
auto it2 = Library.count(author);//返回关键词为author的元素数量

while (it2)
{
if (it1->second == "海克斯科技核心")
{
Library.erase(it1);//直接删除此关键字值对,传入参数为指向它的迭代器
break;//需要,不然下面调用到已经删除的迭代器,会出粗
}
++it1;
--it2;
}
map<string,set<string>> Library2;//排序所用map,set可自动排序
multimap<string,string>::iterator it3 = Library.begin();
for (it3; it3 != Library.end(); ++it3)
{
/*Library2.insert(make_pair(it3->first,it3->second));*/
Library2.[it3->first].insert(it3->second);
cout<<it3->first<<"的宝贝儿:"<<it3->second<<endl;
}

map<string,set<string>>::iterator it4 = Library2.begin();
for (it4;it4 != Library2.end(); ++it4)
{
cout<<it4->first<<"的宝贝儿:";
set<string>::iterator it5 = it4->second.begin();
for(it5; it5 != it4->second.end(); ++it5)
{
cout<<*it5<<",";
}
}

return 0;
}


33:书中程序已经非常好了,建议自行手敲一遍,实现即可

  

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

35:如果重复出现多次同样的key值 ,用下标操作后面的value会替换前面的value,而insert则不会替换

36:不会受到影响,因为仅包含一个key和一个空格,buildmap函数中判断value.size()<=1, 即后面没有value则抛出异常

37:知识点1:

无序版本优势:当容器中key没有明显的顺序关系时更有用,且不需要耗费多余的时间来维护容器中的key序列

有序版本优势:当容器中key有明显的顺序关系时更有用,且我们不需要考虑排序问题,容器自动维护序列(字典序)

知识点2:map的key_value是有序的,set本身就是有序的,有序容器的操作可以用于无序容器

知识点3:无序容器访问元素时,首先计算元素的哈希值,它指出应该搜索那个桶,因为容器讲哈细致相同的元素放在一个桶中,注意表11.8的各项操作

38:貌似是没有任何变化的,用这个无序容器应该是不影响操作的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息