• C++ STL常用方法 ——vector、map、set、unordered_map、unordered_set


    一、map

    1.map简介

    map是一种关联式容器,一对一的映射

    • 第一个是key,是唯一的。
    • 第二个是value,关键字所对应的值。

    因为map的底层实现是红黑树,所以map会对插入的数据进行排序。

    2.插入元素

    采用insert直接下标访问两种方式,同时可以看到输出是按照key值排序。

    #include"map"
    int main() {
        map<int,string> um;
        um.insert(pair<int,string>(2,"steve"));
        um[1]="antonio";
    
        //访问方式,可以看到插入的元素最后会按照key值排序
        for (auto item:um) {
            cout<<item.first<<"  "<<item.second<<endl;
        }
        //1  antonio
        //2  steve
        return  0;
    }

    3.查找元素

    查找key出现的位置,如果没有在map中,则返回end(指向尾部的迭代器)

    #include"map"
    int main() {
        map<int,string> um;
        um.insert(pair<int,string>(2,"steve"));
        um[1]="antonio";
    
        if(um.find(2)!=um.end())
            cout<<"have found"<<endl;
        else
            cout<<"not found"<<endl;
        return  0;
    }

    4.map常用成员方法

    begin() 返回指向map头部的迭代器

    end() 返回指向map末尾的迭代器

    rbegin() 返回一个指向map尾部的逆向迭代器

    rend() 返回一个指向map头部的逆向迭代器

    clear() 删除所有元素

    count() 返回指定元素出现的次数

    empty() 如果map为空则返回true

    erase() 删除一个元素

    find() 查找一个元素

    insert() 插入元素

    lower_bound() 返回键值>=给定元素的第一个位置

    size() 返回map中元素的个数

    5.map和unordered_map比较

    在数据量小的时候,unordered_map比map慢

    原因在于unordered_map的初始化比较耗时,我们都知道map是红黑树,unordered_map是哈希表,造成性能差异的原因在于,红黑树初始化时,节点只需要一个,后续的插入只是插入新的节点,但是哈希表初始化时就不是那么简单了,哈希表初始化时需要申请一个数组,数组的每个元素都指向一条链表,所以初始化时需要申请很多内存,相比于map,的确更耗时。

    二、set

    1.set简介

    set只保存一个元素,就是key。

    set底层实现同样是红黑树,故而内部数据是会排序好。

    2.set的插入和遍历

    采用insert方法插入。

    #include"set"
    int main() {
        set<int> us;
        us.insert(3);
        us.insert(1);
        us.insert(2);
        
        //1 2 3
        for (auto item:us) {
            cout<<item<<" ";
        }
        return  0;
    }

    3.set常用成员方法

    begin()        返回set容器的第一个元素

    end()      返回set容器的最后一个元素

    rbegin()     返回的值和end()相同

    rend()     返回的值和rbegin()相同

    clear()          删除set容器中的所有的元素

    empty()     判断set容器是否为空

    size()      返回当前set容器中的元素个数

    三、 unordered_map

    1.简介

    unordered_map是一种关联式容器,一对一的映射

    • 第一个是key,是唯一的。
    • 第二个是value,关键字所对应的值。

    底层实现是hash表,故而其内的元素是无序的。

    其中hash是使用的拉链法解决冲突。如下图所示

    2.元素初始化

    插入有常用的两种方式,赋值常用量两种方式。

    #include"unordered_map"
    #include "iostream"
    using namespace std;
    //对unordered_map<int,string>使用别名int_string
    typedef unordered_map<int,string> int_string;
    int main() {
        //初始化的几种方法
        int_string one={{3,"bash"},{1,"java"}};
        one[4]="python";//直接下标插入元素
        one.insert(pair<int,string>(2,"c++"));//使用成员方法insert插入元素
    
        int_string two ( one );       // 用数组初始
        int_string three ( two.begin(),two.end());   // 范围初始化
    
        //访问方式
        for (auto item:three) {
            cout<<item.first<<"  "<<item.second<<endl;
        }
        return  0;
    }

    3.常用成员方法

    begin()    指向第一个元素
    end()       指向最后一个元素的迭代器
    empty()   判别是否为空
    size()      所有键值对的数量
    insert()    插入一对元素
    erase()    删除指定的键值对
    find()       查找元素,如果存在返回的是key值对应的迭代器,如果不存在返回的是end()

    四、 unordered_set

    1.简介

    只保存关键词key

    底层实现是hash表,故而其内的元素是无序的。

    2.数据初始化

    #include"iostream"
    #include"unordered_set"
    using namespace std;
    typedef unordered_set<int> US;
    int main() {
        US us;
        us.insert(2);
        us.insert(1);
        US one(us);//one=us;是等价的
        US two(one.begin(),one.end());
    
        //访问方式
        for (auto item:two) {
            cout<<item<<endl;
        }
        return  0;
    }

    五、vector

    1.简介

    vector是序列式容器,按照下表访问。

    2.数据初始化

    含有一维数组和二维数组的初始化

    #include"vector"
    using namespace std;
    typedef vector<int> Vector;
    int main() {
        Vector vec(10,5);
        Vector vec1(vec); //Vector vec1=vec这两种方式是等价的
        Vector vec2(vec.begin(),vec.end());
        Vector vec3={1,2,3,4};
        Vector vec4(10);//初始化数组的大小是10,value是0
        Vector vec5(10,1);//初始化数组的大小是10,value是1
        //二维矩阵的初始化
        vector<vector<int>> ans(12,vector<int>(10,0));
        vector<vector<int>> ans1(ans);
        return  0;
    }

    3.常用成员方法

    begin()        指向第一个元素的迭代器
    end()           指向最后一个元素的下一个位置的迭代器
    empty()       判别是否为空
    size()          存储的数据量
    insert()        插入元素
    push_back()    在尾部插入元素
    pop_back()      将尾部元素弹出

    #include"iostream"
    #include"vector"
    using namespace std;
    typedef vector<int> Vector;
    int main() {
        Vector vec;
        vec.push_back(1);//push元素到末尾
        vec.push_back(2);
        vec.push_back(3);
        vec.insert(vec.begin()+1,-1);
    
        //1 -1 2 3
        for (int i = 0; i < vec.size(); ++i) {
            cout<<vec[i]<<" ";
        }
        vec.pop_back();//将元素弹出
        //1 -1 2
        for (int i = 0; i < vec.size(); ++i) {
            cout<<vec[i]<<" ";
        }
        return  0;
    }
  • 相关阅读:
    python随机生成
    socket、tcp、http
    TCP三次握手和http过程
    iOS多线程的初步研究(十)-- dispatch同步
    dispatch队列
    IOS多线程编程之Grand Central Dispatch(GCD)介绍和使用
    UIWebView 自定义网页中的alert和confirm提示框风格
    dispatch_semaphore
    app内购提示,您已购买此商品,但未下载
    单例的写法
  • 原文地址:https://www.cnblogs.com/AntonioSu/p/11864333.html
Copyright © 2020-2023  润新知