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
上一篇下一篇

猜你喜欢

热点阅读