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

C++Primer第五版 11.3.1节练习

2015-10-08 16:09 429 查看
练习11.15:对一个int到
vector<int>
的map,其
mapped_type
key_type
和value_type分别是什么?


map<int,vector<int>>::mapped_type v1;//v1 是一个vector<int>类型
map<int,vector<int>>::key_type v2;    //v2 是一个int类型
map<int,vector<int>>::value_type v3;   //v3 是一个pair<int,vector<int>>类型


练习11.16:使用一个map迭代器编写一个表达式,将一个值赋予一个元素。

/*
*C++primer(第五版)
*练习11.16
*2015/10/8
*问题描述:
练习11.16:使用一个map迭代器编写一个表达式,将一个值赋予一个元素。
*说明:简单写了个样例,找到关键字“good”,将good后面值变为100,关键字不能被赋值,因为是const的
*作者:Nick Feng
*邮箱:nickgreen23@163.com
*/

#include <iostream>
#include <string>
#include <map>

using namespace std;

int main()
{
map<string,int> m1{{"good",1},{"girl",2},{"boy",3}};

map<string,int>::iterator it = m1.begin();
while(it != m1.end())
{
if((*it).first == "good")
(*it).second = 100;
++it;
}

for(auto &m : m1)
cout << m.first << " " << m.second << " ";
cout << endl;
return 0;
}


练习11.17:假定c是一个string的multiset,v是一个string的vector,解释下面的调用。指出每个调用是否合法。

copy(v.begin(),v.end(),inserter(c,c.end()));//正确
copy(v.begin(),v.end(),back_inserter(c)); //错误 multiset没有push_back这个操作,尾插法不适合
copy(c.begin(),c.end(),inserter(v,v.end()));//正确
copy(c.begin(),c.end(),back_inserter(v));//正确


/*
*C++primer(第五版)
*练习11.17
*2015/10/8
*问题描述:
练习11.17:假定c是一个string的multiset,v是一个string的vector,解释下面的调用。指出每个调用是否合法。
copy(v.begin(),v.end(),inserter(c,c.end()));
copy(v.begin(),v.end(),back_inserter(c));
copy(c.begin(),c.end(),inserter(v,v.end()));
copy(c.begin(),c.end(),back_inserter(v));

*说明:为了看效果,需要把注释的一个一个去掉,单独看一句copy
*作者:Nick Feng
*邮箱:nickgreen23@163.com
*/

#include <iostream>
#include <string>
#include <set>
#include <map>
#include <algorithm>

using namespace std;

int main()
{
multiset<string> c = {"good","good","best","never","let","it","rest"};
vector<string> v = {"good","good","best","never","let","it","rest"};
copy(v.begin(),v.end(),inserter(c,c.end()));//正确
//copy(v.begin(),v.end(),back_inserter(c)); //错误 multiset没有push_back这个操作,尾插法不适合
//copy(c.begin(),c.end(),inserter(v,v.end()));//正确
//copy(c.begin(),c.end(),back_inserter(v));//正确

for(vector<string>::iterator it = v.begin(); it != v.end(); ++it)
cout << *it << " ";
cout << endl;

for(multiset<string>::iterator it = c.begin(); it != c.end(); ++it)
cout << *it << " ";
cout << endl;
return 0;
}


练习11.18:写出第382页循环中map_it的类型,不要使用auto或decltype。

答:
map<const string, size_t>::iterator map_it//见382页11.3.1节


练习11.19:定义一个变量,通过对11.2.2节(第378页)中的名为bookstore的multiset调用begin()来初始化这个变量。写出变量的类型,不要使用auto或decltype.

/*
*C++primer(第五版)
*练习11.19
*2015/10/8
*问题描述:练习11.19:定义一个变量,通过对11.2.2节(第378页)中的名为bookstore的multiset调用begin()来初始化这个变量。写出变量的类型,不要使用auto或decltype.
*说明:如果你会做练习11.11,这道题你就明白怎么做了
*作者:Nick Feng
*邮箱:nickgreen23@163.com
*/

/*
*C++Primer(第五版)
*11.2.2节练习
*练习11.11
*问题描述:练习11.11:不使用decltype重新定义bookstore。
* 说明:这道题是让你明白decltype(compareIsbn)*的类型究竟是什么,顺便复习了一下函数指针的内容
*作者:Nick Feng
*邮箱:nickgreen23@163.com
*/

#include <iostream>
#include <set>
#include "Sales_data.h"

using namespace std;

bool compareIsbn(const Sales_data &lhs, const Sales_data &rhs)
{
return lhs.isbn() < rhs.isbn();
}

int main()
{
//注释的地方为原始定义
//multiset<Sales_data,decltype(compareIsbn)*> bookstore(compareIsbn);
bool (*pf)(const Sales_data &,const Sales_data &) = compareIsbn;
//pf是指向compareIsbn函数的指针

//F是函数类型,不是指针,F*是一个带指针的复合类型,参考P223页
using F = bool(const Sales_data &,const Sales_data &);
multiset<Sales_data,F*> bookstore(compareIsbn);

multiset<Sales_data,F*>::iterator it = bookstore.begin(); //本题要求你做的东西
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息