码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2014-08-31 10:26:41      阅读:426      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   使用   ar   for   div   问题   

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章 关联容器 读书笔记 习题答案

标签:style   blog   color   os   使用   ar   for   div   问题   

原文地址:http://www.cnblogs.com/kkkwjx/p/3946593.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!