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

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

2017-03-01 09:33 615 查看
11:知识点:当我们使用decltype作用于某个函数时,它返回函数类型而非指针类型,因此我们需要显示的加上*已表明我们需要返回指针。作用:选择并返回操作数的类型,若为函数,则类型为函数的返回类型

using compareType = bool (*)(const Sales_data& lhs, const Sales_data& rhs);//使用using来代替函数类型


12:知识点:pair,标准库类型,保存在头文件utility中。保存两个数据成员,类似容器。

#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)
{
vector<pair<string,int>> vec1(12);//事先定义大小,或者使用push_back()
ifstream in1("1.txt");
string str;
size_t i = 0;
while (in1>>str)
{
vec1[i].first = str;
++i;
}
ifstream in2("2.txt");
int val;
size_t j = 0;
while (in2>>val)
{
vec1[j].second = val;
++j;
}

vector<pair<string,int>>::iterator it1 = vec1.begin();
cout<<"vector中元素为:"<<endl;
for (it1; it1 != vec1.end(); ++it1)
{
cout<<it1->first<<" "<<it1->second<<endl;
}

return 0;
}


13:知识点: pair有三种定义方式,所以创建pair的方式也有三种,make_pair(v1,v2)返回(创建)一个pair

vec.push_back(std::make_pair(str, i));//make_pair返回一个用两个参数构成的pair
vec.push_back({str, i});
vec.emplace_back(str, i); //最简便


14:知识点:还是注意在while中使用lambda表达式的好处与用法!

#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)
{
//map的定义
map<string,vector<string>> family;
vector<pair<string,string>> child;
string first_name,child_name,_birthday;

cout<<"本输入中,均以end输入表示截至"<<endl;
//在while中使用lambda语句,可以传入多条语句参数,将我们想要传入的的输出参数也放在其中,注意后面的一对括号
while ( [&]()->bool {cout<<"请输入家庭的姓:"; return cin>>first_name && (first_name != "end");}() )
{
while ([&]()->bool {cout<<"请输入孩子的名字:"; return cin>>child_name && (child_name != "end");}())
{
family[first_name].push_back(child_name);
while ([&]()->bool {cout<<"请输入孩子的生日:"; return cin>>_birthday && (_birthday != "end");}())
{
child.push_back(make_pair(child_name,_birthday));
}

}
}

//map同样支持迭代器操作
map<string ,vector<string>>::iterator mapi;
for (mapi = family.begin(); mapi != family.end(); ++mapi)//C++ 11支持:const auto &s : word_count
{
//两个成员分别代表关键字和对应值
cout<<mapi->first<<" :";
vector<string>::iterator it1 = mapi->second.begin();
for (it1; it1 != mapi->second.end(); ++it1)
{
cout<<*it1<<" ";
}
}

vector<pair<string,string>>::iterator it1 = child.begin();
cout<<"孩子们的信息:"<<endl;
for (it1; it1 != child.end(); ++it1)
{
cout<<it1->first<<" "<<it1->second<<endl;

}

return 0;
}


15:知识点1:P295有的类型,关联容器皆支持

知识点2:关联容器额外的类型别名:

key_type:表示此容器类型的关键字类型

mapped_type:每个关键字关联的类型,只适用于map

value_type:对于set,与key_type相同,对于map,为pair<const key_type,mapped_type>

知识点3:当解引用一个关联容器的迭代器时,我们会得到一个类型为容器的value_type的值的引用

知识点4:map的value_type是一个pair,我们可以改变pair的值,但是不能改变关键字成员的值

所以此题中,该map的key_type为int类型,value_type为pair<int ,vector<int>>类型,mapped_type为vector<int>类型。

16:

map<string,string> familyy;
map<string,string>::iterator it1;
it1->first = "I love you";//错误用法,key的值是const,不可修改
it1->second = "Me too !";


17:参考P358页,关于插入迭代器的讲解,第三个back_inserter()需要使用push_back(),而set不能够使用push_back()

18:

pair<const string, size_t>::iterator map_it;


19:

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

20:知识点1:insert()在关联容器中添加一个元素或者一个元素范围,由于map和set没有重复关键字,所以插入相同的元素不会产生任何的影响

知识点2:向map中插入元素,必须是pair类型。

auto ret = word_count.insert({word, 1});
if (!ret.second) ++ret.first->second;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息