C++之map-set-multimap-multiset

关于map-set-multimap-multiset基本的知识点都打上注释了

map1.cpp

#include <iostream>
#include <map>
#include <set>
#include <string>
using std::string;
using std::cout;
using std::cin;
using std::endl;
using std::map;
using std::set;
int main(){
    //两个主要的关联容器类型是map和set
    //标准库提供了8个关联容器
    //map-关联数组-保存key-value
    //set-关键字即值,即只保存关键字的容器

    //简单的单词计数程序
    map<string,size_t> word_count;
    string word;
    while(cin>>word){
        ++word_count[word];
    }
    for(const auto &w:word_count){  //遍历map中的每个元素
        //打印结果
        cout<<w.first<<" occurs "<<w.second<<((w.second>1)?" time":" times")<<endl;
    }
}

map2.cpp

#include <iostream>
#include <map>
#include <set>
#include <string>
using std::string;
using std::cout;
using std::cin;
using std::endl;
using std::map;
using std::set;
int main(){
    //两个主要的关联容器类型是map和set
    //标准库提供了8个关联容器
    //map-关联数组-保存key-value
    //set-关键字即值,即只保存关键字的容器
    //使用set
    map<string,size_t> word_count_2; //空map
    set<string> exclude = {"The","But","And","Or","An","A","the","but","and","or","an","a"};

    string word_2;
    while(cin>>word_2){
        //只统计不在exclude中的单词
        if(exclude.find(word_2)==exclude.end()){
            ++word_count_2[word_2];
        }
    }
    for(const auto &w:word_count_2){  //遍历map中的每个元素
        //打印结果
        cout<<w.first<<" occurs "<<w.second<<((w.second>1)?" time":" times")<<endl;
    }
}

map3.cpp

#include <iostream>
#include <map>
#include <set>
#include <string>
using std::string;
using std::cout;
using std::cin;
using std::endl;
using std::map;
using std::set;
int main(){

    //定义关联容器-必须指明关键字类型,同时指明值类型
    //每个关联容器都定义了一个默认构造函数

    //对关联容器进行列表初始化
    map<string,string> authors = {{"hi","wo"},{"ji","ba"},{"yl","ca"}};

    cout<<"map关联数组还可以这样访问啊==="<<authors["hi"]<<"  "<<authors["ji"]<<endl;


    for(auto &a:authors){
        cout<<"key="<<a.first<<" "<<"value="<<a.second<<"\n"<<endl;
    }
}

map4.cpp-标准库类型pair

#include <set>
#include <string>
#include <utility>
#include <iostream>
#include <map>
#include <vector>
using std::string;
using std::cout;
using std::cin;
using std::endl;
using std::map;
using std::set;
using std::pair;
using std::vector;
int main(){
    //pair标准库类型,定义在头文件utility中
    //pair使用默认构造函数对数据成员进行值初始化
    pair<string,string> nonn;
    pair<string,vector<int>> line;

    pair<string,string> author {"jjjj","sdsdsd"};
    pair<string,string> hello {"sdsd","dddd"};

    //pair的数据成员是public的,成员分别命名为first和second
    cout<<author.first<<"  "<<author.second<<endl;

    cout<<"author和hello比较当first和second都相等时才会相等="<<(author==hello?"true":"false")<<endl;

}

map5.cpp

#include <set>
#include <string>
#include <utility>
#include <iostream>
#include <map>
#include <vector>
using std::string;
using std::cout;
using std::cin;
using std::endl;
using std::map;
using std::set;
using std::pair;
using std::vector;
int main(){
    //关联容器的操作


    //容器关键字和值的类型
    /*
    key_type:此容器类型的关键字类型
    mapped_type:每个关键字关联的类型,只适用于map
    value_type:对于set,与key_type相同
                对于map,为pair<const key_type,mapped_type>
    */
    set<string>::key_type v2;    //v2是一个string
    set<string>::value_type v1;  //v1是一个string

    map<string,int>::value_type v3; //v3是一个pair<const string,int>
    map<string,int>::key_type v4; //v4是一个string
    map<string,int>::mapped_type v5; //v5是一个int

    ///////////////////////////////
    map<string,size_t> word_count;
    string word;
    while(cin>>word){
        ++word_count[word];
    }

    //关联容器的迭代器
    auto word_count_it = word_count.cbegin();
    cout<<word_count_it->first<<endl;
    cout<<word_count_it->second<<endl;
    //word_count_it->first = "new key"; //key不能被重新赋值

    //遍历关联容器
    //使用迭代器
    while(word_count_it != word_count.cend()){
         //打印结果
        cout<<word_count_it->first<<" occurs "<<word_count_it->second<<((word_count_it->second>1)?" time":" times")<<endl;
        ++word_count_it;
    }
}

map6.cpp

#include <set>
#include <string>
#include <utility>
#include <iostream>
#include <map>
#include <vector>
using std::string;
using std::cout;
using std::cin;
using std::endl;
using std::map;
using std::set;
using std::pair;
using std::vector;
using std::make_pair;
int main(){

    //使用insert插入元素
    vector<int> ivec = {1,2,3,4,5,6,7};
    set<int> set2;
    set2.insert(ivec.cbegin(),ivec.cend());  //set2现在有7个元素
    //接受一个初始化列表
    set2.insert({8,9}); //set2现在又9个元素

    //向map添加元素
    //insert的四种方式
    map<string,string> hellomap;
    hellomap.insert({"hello","world"});
    hellomap.insert(make_pair("hhh","ssd"));
    cout<<hellomap["hhh"]<<endl;
    hellomap.insert(pair<string,string>("sdsd","sdsdsdsd"));
    cout<<hellomap["sdsd"]<<endl;
    hellomap.insert(map<string,string>::value_type("sdsdsdsd","kkkkkkkkkkkk"));
    cout<<hellomap["sdsdsdsd"]<<endl;

    //insert的返回值
    //insert返回的值依赖于容器类型和参数
    //insert返回一个pair,pair的first成员是一个迭代器,指向具有给定关键字的元素;second成员是一个bool值,指出元素是
    //插入成功还是已经存在容器内。如果关键字已经存在容器中,则insert什么都不做,返回值的second为false。如果不存在,
    //bool为true

    map<string,size_t> word_count;
    string word;
    while(cin>>word){
       auto ret = word_count.insert({word,1});
       if(!ret.second){
            ++ret.first->second; //递增计数器
       }
    }

    for(const auto &w:word_count){  //遍历map中的每个元素
        //打印结果
        cout<<w.first<<" occurs "<<w.second<<((w.second>1)?" time":" times")<<endl;
    }
}

multimap.cpp

#include <iostream>
#include <map>
#include <set>
#include <string>
#include <vector>
//using std::string;
//using std::cout;
//using std::cin;
//using std::endl;
//using std::map;
//using std::set;
//using std::vector;
//using std::multiset;
//using std::multimap;
using namespace::std;
int main(){
    //multimap中关键字可以重复,而map中关键字必须是唯一的。
    //multiset中关键字可以重复,二set中关键字必须是唯一的。

    //使用vector初始化一个set和一个multiset
    vector<int> ivec;
    for(vector<int>::size_type i=0;i!=10;++i){
        ivec.push_back(i);
        ivec.push_back(i);
    }

    //初始化一个set
    //ivec.cbegin()返回一个vector<int>::const_iterator类型的变量
    set<int> iset(ivec.cbegin(),ivec.cend());
    //初始化一个multiset
    multiset<int> miset(ivec.cbegin(),ivec.cend());

    cout<<"set的长度=="<<iset.size()<<endl;
    cout<<"multiset的长度=="<<miset.size()<<endl;

   multimap<string,string> hello_multimap;
   //插入第一个元素
   hello_multimap.insert({"hello","sdsdsd"});
   //插入第二个元素
   hello_multimap.insert({"hello","sdsdsdsdsdsd"});
   cout<<hello_multimap.size()<<endl;

   //在multimap中查找元素
   auto entries = hello_multimap.count("hello");
   auto it = hello_multimap.find("hello");
   cout<<"hello_multimap容器中第一个key=hello的value="<<hello_multimap.find("hello")->second<<endl;
   while(entries){
        cout<<it->second<<endl;
        ++it;
        --entries;
   }
}

map_remove.cpp

#include <set>
#include <string>
#include <utility>
#include <iostream>
#include <map>
#include <vector>
using std::string;
using std::cout;
using std::cin;
using std::endl;
using std::map;
using std::set;
using std::pair;
using std::vector;
using std::make_pair;
int main(){

    //删除map中的元素
    //使用erase函数
    //对于允许重复关键字的容器,删除的数量可能大于1
    map<string,string> hello_map{{"f","f"},{"d","d"},{"a","a"},{"s","s"}};

    if(hello_map.erase("f")){
        //返回0不在此容器中
        //返回1表示在容器中并删除成功
        cout<<"删除成功!!!"<<" "<<endl;
    }

    //map的下标操作
    hello_map["ni"] = "ni";
    //上面这条语句执行的操作:
    //在容器中搜索关键字为ni的元素,未找到
    //将一个新的关键字-值对插入到容器中,值会进行值初始化,为字符串
    //提取出新插入的元素,并将新值赋给他
    cout<<hello_map["ni"]<<endl;

    if(hello_map.find("d")==hello_map.end()){
        cout<<"key==d的元素不在该容器内!!!"<<endl;
    }else {
        cout<<"key==d的元素在该容器内!!!"<<endl;
    }

    //使用find方法访问元素
    set<int> iset = {1,2,3,4,5,6,7,8,9};
    auto it1=iset.find(1); //返回一个迭代器,指向key==1的元素
    auto it2=iset.find(11); //返回一个迭代器,其值为iset.end();
    iset.count(2); //返回key==2的元素的数量,对于不允许重复的容器,返回的值永远是0或1
    cout<<"it1指向的值为"<<(*it1)<<"\n"<<"it2指向的值为"<<(*it2)<<endl;
    /*
    删除成功!!!
    ni
    key==d的元素在该容器内!!!
    it1指向的值为1
    it2指向的值为9
    */
}

=====END=====

你可能感兴趣的:(set,map,Multimap,multiset)