c++primer 11.1-11.11
2019-05-19 本文已影响0人
青吟乐
11.1
map是关联容器,里面放键值对<key,value>,vector是顺序容器,不能放键值对的
11.2
list是双向链表,适合插入删除元素频繁的场景
vector是数组容器,适合大量的随机访问
deque是双端列队,适合首尾元素插入删除多的场合
map是关联数组,适合需要用关键字指明关键字指代的值的场合,可能值会发生变化,但是关键字不变,所以关键字适合访问
set是不允许重复的关键字的集合。用来检查是否有重复的关键字
11.3
#include <iostream>
#include<map>
#include<string>
#include<algorithm>
#include<cctype>//字符处理库
#include<istream>
#include<sstream>
#include<fstream>
#include<set>
using namespace std;
int main()
{
map<string,size_t> word_count;//空map
string word;
ifstream ifs;
//从文件中读入字符串
ifs.open("C:\\study\\c++test\\endless.txt");
while(ifs>>word){
//map中有word的话自加1,map中没有word的话就把word作为关键字放到最后
++word_count[word];
}
//循环输出key value键值对
for( auto &w : word_count){
cout<<w.first<<" occurs: "<<w.second<<((w.second>1?" times":" time"))<<" ";
}
cout<<"--------------"<<endl;
map<string,size_t> word_count_exclude;
set<string > exclude ={"the","But"};
string word_exclude;
ifstream ifs1("C:\\study\\c++test\\endless.txt");
while(ifs1>>word_exclude){
if(exclude.find(word_exclude)==exclude.end()){
++word_count_exclude[word_exclude];
}
}
//循环输出key value键值对(去掉exclude里面的单词版本)
for( auto &w : word_count_exclude){
cout<<w.first<<" occurs: "<<w.second<<((w.second>1?" times":" time"))<<" ";
}
return 0;
}
11.4
这里有个问题,我在include下面加上命名空间
using namespace std;
程序就会报错
image.png
我不明白是为什么。。。删掉就好了
#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>
#include <sstream>
#include <fstream>
#include<istream>
#include <map>
/**
*忽略大小写和标点计算各个单词出现几次
*/
void thin_word_11_4(std::map<std::string, int>& word_count,std::ifstream &ifs){
std::string word;
while (ifs >> word)
{
//转换成小写
for (auto& ch : word)
ch = tolower(ch);
//删除标点
word.erase(std::remove_if(word.begin(), word.end(), ispunct),word.end());
++word_count[word];
}
//循环显示
for (const auto& e : word_count)
std::cout << e.first << " occurs: " << e.second<<(e.second>1?" times":" time") << "\n";
}
int main()
{
std::map<std::string,int> word_count_11_4;
std::ifstream ifs_11_4("C:\\study\\c++test\\endless.txt");
thin_word_11_4(word_count_11_4,ifs_11_4);
return 0;
}
11.5
map是不重复键值对,set是不重复关键字
map存放键值对对应的情况,set存放不重复关键字的情况
11.6
set中的关键字不可以重复并且是有序的
list里面存放的可以重复,有序无序是使用者使用决定
11.7
#include <iostream>
#include<vector>
#include<map>
#include<set>
#include<string>
using namespace std;
int main()
{
//11.7
std::map<std::string,std::vector<std::string>> family;
std::string first_name,second_name;
//这里的while的条件中的lamda判别式有两个作用
//1,输出一下please input first_name:
//2,判断first_name的是否是end,是end就停止输入
while([&first_name](){std::cout<<"please input first_name:";return std::cin>>first_name&&(first_name!="end");}()){
std::cout<<"please input children's name:";
//输入孩子的名字 遇到end结束
while(std::cin>>second_name&&(second_name!="end")){
family[first_name].push_back(second_name);
}
}
//两个迭代器遍历输出
for(const auto &miter:family){
std::cout<<miter.first<<":";
for(auto iter = miter.second.cbegin();iter!=miter.second.cend();iter++){
std::cout<<*iter<<" ";
}
std::cout<<std::endl;
}
return 0;
}
11.8
对于不重复的处理简便
#include <iostream>
#include<vector>
#include<map>
#include<set>
#include<string>
using namespace std;
int main()
{
vector<string> vec_11_8;
string word;
bool kk;
//lamda判定word的值是否是end,是end就结束while
//为什么lamda后面还加了一个()我也不知道为什么
while([&word]()
{
cout<<"please input word:";
return cin>>word&&(word!="end");
}())
{
kk=false;
for(auto &c:vec_11_8)
{
if(c==word)
{
kk=true;
}
}
if(kk)
{
;
}
else
{
vec_11_8.push_back(word);
}
}
cout<<endl;
for(auto &w:vec_11_8)
{
cout<<w<<" ";
}
return 0;
}
11.9
map<word,list<int>> map_11_9;
11.10
vector<int>::iterator 可以指向键为int的map,因为vector的迭代器支持比较运算
list<int>::iterator 不可以指向键为int的map,因为list的迭代器不支持比较运算
11.11
加(*)使用别名来指代返回函数的返回类型的指针
using compareType = bool (*)(const Sales_data& lhs, const Sales_data& rhs);
//使用using