C++primer练习11.1-11.8
练习11.1
描述map和vector的不同
::容器中的元素是按照关键字值储存的,关键字值与元素数据建立起对应关系,这就是“关联”的含义。底层数据结构是红黑树,哈希表等,可高效实现按关键字值查找,添加,删除元素等操作,且没有下标上限这一说法,如果在map里没有该下标,会自动生成一个下标命名来进行操作。vector 是对内存的申请是要一大块,而map是一个一个new和delete。
练习11.2
分别给出最适合使用list、vector、deque、map以及set的例子
::list排行榜、vector字面值数据分类、deque排队购票系统、map字典、set个人得分记录高低顺序
练习11.3
编写你自己的单词计数程序
void wordCount() { map<string,string::size_type> word_count; set<string> exclude={"the","but","and"}; string word; while(cin>>word) { if(exclude.find(word)==exclude.end()) ++word_count[word]; } for(auto d:word_count) cout<<d.first<<d.second; cout<<endl; }
练习11.4
扩展你的程序,忽略大小写和标点
string lower(string&a) { string b; for(auto &d:a) { if(!ispunct(d)) b.push_back(d); } return b; } void wordCount() { map<string,string::size_type> word_count; set<string> exclude={"the","but","and",",",".","!","?"}; string word; while(cin>>word) { if(exclude.find(word)==exclude.end()) ++word_count[lower(word)]; } for(auto d:word_count) cout<<d.first<<d.second; cout<<endl; }
练习11.5
解释map和set的区别。你如何选择使用哪个
::
map中的元素是key-value(键值对)对:关键字起到索引的作用,值则表示与索引相关联的数据;Set与之相对就是关键字的简单集合,set中每个元素只包含一个关键字。
set的迭代器是const的,不允许修改元素的值;map允许修改value,但不允许修改key。
对于存储数据是成对的用map
练习11.6
解释set和list的区别。你如何选择使用哪个
::set是无旭且不允许关键字重复的,而list是有序且可以重复的
练习11.7
定义一个map,关键字是家庭的姓,值是一个vector,保存家中孩子们的名。编写代码,实现添加新的家庭成员以及向已有家庭中添加新的孩子
void family() { map<string,vector<string>> roster; string firstname; while(cin>>firstname) { string name; cin>>name; roster[firstname].push_back(name); } for(auto d:roster){ cout<<d.second; for(auto k:d.second) cout<<k; cout<<endl; }}
练习11.8
编写一个程序,在一个vector而不是一个set中保存不重复的单词,使用set的优点是什么
bool inspection(string& a,vector<string>&b) { for(auto d:b) { if(d==a) return false; } return true; } void uniqueword() { vector<string>words; string word; while(cin>>word) { if(inspection(word,words)) words.push_back(word) } }
防止重复