首页 > 代码库 > 《C++primer》v5 第11章 关联容器 读书笔记 习题答案

《C++primer》v5 第11章 关联容器 读书笔记 习题答案

11.1

map是关联容器,vector是顺序容器

11.2

11.3

int main(){    map<string,int> word;    string s;    while(cin>>s)        word[s]++;    for(auto i:word)        cout<<i.first<<" "<<i.second<<endl;    return 0;}

11.4

void convers(string &s){    string t;    for(auto i:s)        if(isalpha(i))            t+=tolower(i);    s=t;}int main(){    map<string,int> word;    string s;    while(cin>>s)    {        convers(s);        word[s]++;    }    for(auto i:word)        cout<<i.first<<" "<<i.second<<endl;    return 0;}

11.5

维护键和值用map,维护键用set

11.6

set是集合,关联容器,无重复键

list是链表,顺序容器,可重复

11.7

int main(){    map<string,vector<string>> mp;    int n;    cin>>n;    while(n--)    {        string a,b;        cin>>a>>b;        mp[a].push_back(b);    }    for(auto &i:mp)    {        cout<<i.first<<" : "<<endl;        for(auto j:i.second)            cout<<j<<" ";        cout<<endl;    }    return 0;}

11.8

使用unique。

11.9

int main(){    map<string,list<int>> mp;    int n;    cin>>n;    for(int i=0;i<n;++i)    {        string s;        cin>>s;        mp[s].push_back(i+1);    }    for(auto &i:mp)    {        cout<<i.first<<" : "<<endl;        for(auto j:i.second)            cout<<j<<" ";        cout<<endl;    }    return 0;}

11.10

可以定义?但是怎么用有点问题。。    

11.11

bool compareIsbn(const Sales_data &lhs,const Sales_data &rhs){    return lhs.isbn()<rhs.isbn();}int main(){    multiset<Sales_data,bool (*)(const Sales_data&,const Sales_data&)> bookstore(compareIsbn);    return 0;}

使用指向该函数的指针。注意*要括号起来。

11.12

int main(){   string s;   int a;   vector<pair<string,int>> vec;   while(cin>>s>>a)    vec.push_back(make_pair(s,a));   for(auto i:vec)    cout<<i.first<<"  "<<i.second<<endl;    return 0;}

11.13

pair<string,int>{s,a}

pair<string,int>(s,a)

make_pair(s,a)

11.14

int main(){    map<string,vector<pair<string,string>>> mp;    int n;    cin>>n;    while(n--)    {        string a,b,c;        cin>>a>>b>>c;        mp[a].push_back(make_pair(b,c));    }    for(auto &i:mp)    {        cout<<i.first<<" : "<<endl;        for(auto j:i.second)            cout<<j.first<<" "<<j.second<<endl;    }    return 0;}

11.15

mapped_type:关键字关联的类型即vector<int>

key_type:关键字的类型int

value_type:pair<const int,vector<int>>

11.16

int main(){    map<int,int> mp;    int a,b;    while(cin>>a>>b)        mp[a]=b;    for(auto &i:mp)        i.second=99;    for(auto &i:mp)        cout<<i.first<<"  "<<i.second<<endl;    return 0;}

11.17

第1个调用合法。

int main(){    multiset<string> c;    vector<string> v{"abxc","sfsa","vxcv"};    copy(v.begin(),v.end(),inserter(c,c.end()));    for(auto i:c)        cout<<i<<endl;    return 0;}

第2个调用不合法,因为multiset没有push_back操作。

第3个调用合法。

int main(){    multiset<string> c{"abxc","sfsa","vxcv","abxc"};    vector<string> v;    copy(c.begin(),c.end(),inserter(v,v.end()));    for(auto i:v)        cout<<i<<endl;    return 0;}

第4个调用合法。

int main(){    multiset<string> c{"abxc","sfsa","vxcv","abxc"};    vector<string> v;    copy(c.begin(),c.end(),back_inserter(v));    for(auto i:v)        cout<<i<<endl;    return 0;}

11.18

map<string,int>::iterator i=wc.begin();

wc是map<string,int>类型!

11.19

multiset<Sales_data,bool (*)(const Sales_data&,const Sales_data&)>::iterator it=bookstore.begin();

11.20

int main(){    map<string,int> word;    string s;    while(cin>>s)    {        //如果元素已在容器中则什么也不做,返回一个pair对象,first是该位置的迭代器,second表示是否成功插入        auto ret=word.insert({s,1});        //false说明未成功插入,说明早存在于容器中        if(!ret.second)            ++ret.first->second;    }    for(auto i:word)        cout<<i.first<<" "<<i.second<<endl;    return 0;}

11.21

将该word插入到容器中,并将出现次数递增

11.22

int main(){    map<string,vector<int> > mp;    vector<int> a;    pair< map<string,vector<int> >::iterator,bool > p=mp.insert(make_pair("abc",a));    return 0;}

11.23

int main(){    multimap<string,vector<string>> mp;    string a,b;    while(cin>>a>>b)        mp.insert({a,{b}});    for(auto &i:mp)        for(auto j:i.second)        cout<<i.first<<" : "<<j<<endl;    return 0;}

由于可以重复所以这里不能用下标访问了。

11.24

向m中加入一个元素它的键为0,值为1

11.25

访问越界,下标为0的元素不存在。

11.26

可以用key_tpye类型。

返回mapped_type类型。

map<string,bool> mp;

可用string进行下标访问,返回bool类型。

11.27

询问某元素出现次数用count

判断某元素是否出现在容器中用find

11.28

没看懂。。

11.29

upper_bound返回大于x的第一个元素的位置

lower_bound返回小于x的第一个元素的位置

equal_range返回end()

11.30

pos是一个pair保存authors的两个迭代器,first表示该范围的起点,它的second表示题目

11.31

int main(){    multimap<string,string> mp;    string a,b;    while(cin>>a>>b)    mp.insert({a,b});    string s="abc";    mp.erase(s);    for(auto i:mp)        cout<<i.first<<"  "<<i.second<<endl;    return 0;}

11.32

int main(){    multimap<string,string> mp;    string a,b;    while(cin>>a>>b)        mp.insert({a,b});    for(auto i:mp)        cout<<i.first<<"  "<<i.second<<endl;    return 0;}

11.33

 

#include<stdexcept>using namespace std;map<string,string> buildMap(ifstream &map_file){    map<string,string> trans_map;    string key;    string 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 map<string,string> &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<<" ";            cout<<transform(word,trans_map);        }        cout<<endl;    }}int main(){    ifstream trans("map.txt"),input("read.txt");    word_transform(trans,input);    return 0;}

11.34

下标访问时,如果元素不存在就会在容器中插入一个新元素。

11.35

效果一样?

11.36

这样就会抛出异常。

11.37

无序版本内部用hash实现,理论上访问速度更快

有序版对于有顺序要求的情况下非常合适。

11.38

#include<stdexcept>#include<unordered_map>using namespace std;unordered_map<string,string> buildMap(ifstream &map_file){    unordered_map<string,string> trans_map;    string key;    string 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<string,string> &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<<" ";            cout<<transform(word,trans_map);        }        cout<<endl;    }}int main(){    ifstream trans("map.txt"),input("read.txt");    word_transform(trans,input);    return 0;}

 

《C++primer》v5 第11章 关联容器 读书笔记 习题答案