首页 > 代码库 > 《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章 关联容器 读书笔记 习题答案