C++Primer第五版 11.3.1节练习

来源:互联网 发布:访客网络限速多少 编辑:程序博客网 时间:2024/06/03 17:26

练习11.15:对一个int到vector<int>的map,其mapped_typekey_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(); //本题要求你做的东西 }
0 0
原创粉丝点击