• 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 属性,不能用于修改容器
  • 相关阅读:
    Java项目:学生课堂考勤管理系统(java+SSM+JSP+layui+Mysql)
    使用Testconainers来进行JAVA测试
    python调整colorbar宽度的两种方法
    双网关备份(bfd+VRRP+策略路由配置)企业网搭建
    完美卸载mac电脑里的软件及残留清理教程
    研发中台拆分过程的一些心得总结
    关于 虚拟 DOM、Shadow DOM 和 DocumentFragment
    表格table设置css3首行在滚动的时候悬停使用sticky属性
    SpringBoot整合JUnit
    【每日一题Day37】LC795区间子数组的个数 | 单调栈 模拟
  • 原文地址:https://blog.csdn.net/LQEmptycity/article/details/126688329