• c++ || STL关联式容器


    关联式容器

    • 关联式容器与序列式容器不同的是,关联式容器在存储元素时还会为每个元素在配备一个键,整体以键值对的方式存储到容器中
    • 关联式容器可以通过键值对< key,value >直接找到对应元素,无序遍历整个容器
    • 管理师容器在存储元素,默认会根据各元素键值的大小做升序排序
    • 关联式容器查找、访问、插入和删除指定元素的效率更高
    关联式容器名称 特点
    map 定义在 < map> 头文件中,使用该容器存储的数据,其各个元素的键必须是唯一的(即不能重复),该容器会根据各元素键的大小,默认进行升序排序(调用 std::less< T>)。
    set 定义在 < set> 头文件中,使用该容器存储的数据,各个元素键和值完全相同,且各个元素的值不能重复(保证了各元素键的唯一性)。该容器会自动根据各个元素的键(其实也就是元素值)的大小进行升序排序(调用 std::less< T>)。
    multimap 定义在 < map> 头文件中,和 map 容器唯一的不同在于,multimap 容器中存储元素的键可以重复
    multiset 定义在 < set> 头文件中,和 set 容器唯一的不同在于,multiset 容器中存储元素的值可以重复(一旦值重复,则意味着键也是重复的)。

    pair类模板

    • <“C语言教程”, “http://c.biancheng.net/c/”>
      第一个元素作为键(key),第二个元素作为值(value),由于**“键值对”并不是普通类型数据,因此STL标准库提供pair类模板**,专门用来将2个普通元素first和second(可以是c++基本数据类型,结构体,类自定义的类型)创建成一个新元素< first,second>.
    • pair类模板定义在< utility >头文件中
    #1) 默认构造函数,即创建空的 pair 对象
    pair();
    #2) 直接使用 2 个元素初始化成 pair 对象
    pair (const first_type& a, const second_type& b);
    #3) 拷贝(复制)构造函数,即借助另一个 pair 对象,创建新的 pair 对象
    template<class U, class V> pair (const pair<U,V>& pr);
    #4) 移动构造函数
    template<class U, class V> pair (pair<U,V>&& pr);
    #5) 使用右值引用参数,创建 pair 对象
    template<class U, class V> pair (U&& a, V&& b);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    #include 
    #include       // pair
    #include        // string
    using namespace std;
    int main() {
       
        // 调用构造函数 1,也就是默认构造函数
        pair <string, double> pair1;
        pair1.first = "数学教程";
        // 调用第 2 种构造函数
        pair <string, string> pair2("STL教程", "http://c.biancheng.net/stl/");
        // 调用拷贝构造函数
        pair <string, string> pair3(pair2);
        //调用移动构造函数
        pair <string, string> pair4(make_pair("C++教程", "http://c.biancheng.net/cplus/"));
        //调用了 make_pair() 函数,它也是  头文件提供的,其功能是生成一个 pair 对象。
        // 因此,当我们将 make_pair()函数的返回值(是一个临时对象)作为参数传递给 pair()构造函数时,
        // 其调用的是移动构造函数,而不是拷贝构造函数。
        // 调用第 5 种构造函数
        pair <string, string> pair5(string("Python教程"), string("http://c.biancheng.net/python/"));
    
        cout << "pair1: " << pair1.first << " " << pair1.second << endl;
        cout << "pair2: " << pair2.first << " " << pair2.second << endl;
        cout << "pair3: " << pair3.first << " " << pair3.second << endl;
        cout << "pair4: " << pair4.first << " " << pair4.second << endl;
        cout << "pair5: " << pair5.first << " " << pair5.second << endl;
        //pair对象还可以进行比较 first相同则在比较second 都相同
        if (pair4 != pair2) {
       
            cout << "pair != pair2" << endl;
        }
        //pair2和pair3的key相同,value不同
        if (pair2 != pair3) {
       
            cout << "pair2 != pair3" << endl;
        }
    
        pair <string, int> pair8("pair", 10);
        pair <string, int> pair9("pair2", 20);
        //交换 pair8 和 pair9 的键值对
        pair8.swap(pair9);
        cout << "pair8: " << pair8.first << " " << pair8.second << endl;
        cout << "pair9: " << pair9.first << " " << pair9.second << endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    map 映射表

    • map容器存储的都是pair对象,因此各个键值对的键和值可以是任意数据类型
      该容器存储的都是 pair 类型(其中 K 和 T 分别表示键和值的数据类型)的键值对元素。
    • 使用该容器存储的数据,其各个元素的键必须是唯一的且不能被修改(即不能重复),该容器会根据各元素键的大小,默认进行升序排序(调用 std::less< T>)
    • 手动指定map容器的排序规则,std::greater< T >
    • 底层是红黑树
    成员方法 功能
    begin() 返回指向容器中第一个(注意,是已排好序的第一个)键值对的双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
    end() 返回指向容器最后一个元素(注意,是已排好序的最后一个)所在位置后一个位置的双向迭代器,通常和 begin() 结合使用。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
    rbegin() 返回指向最后一个(注意,是已排好序的最后一个)元素的反向双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器。
    rend() 返回指向第一个(注意,是已排好序的第一个)元素所在位置前一个位置的反向双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器。
    cbegin() 和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对。
    cend() 和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对。
    crbegin() 和 rbegin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的键值对。
    crend() 和 rend() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器
  • 相关阅读:
    sql server如主键创建时候没有命名,如何利用sql语句删除呢?
    ArcGIS Pro SDK (一)环境配置
    [密码学入门]仿射密码(Affine)
    js 判断两个object相等
    【Leetcode】1449. Form Largest Integer With Digits That Add up to Target
    高数笔记06:无穷级数
    springboot+高校失物招领系统 毕业设计-附源码121441
    md语法学习
    Mac下好用的日记、电子书阅读器、RSS订阅软件​
    如何使用Gitlab搭建属于自己的代码管理平台
  • 原文地址:https://blog.csdn.net/LQEmptycity/article/details/126688329