• 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 属性,不能用于修改容器
  • 相关阅读:
    MOS管实现的STC自动下载电路
    流媒体文件以及网络应用直播技术
    大数据之数据质量检查
    ubuntu 安装串口工具和添加虚拟串口
    idea中maven plugin提示not found
    零基础刷LeetCode-10- I. 斐波那契数列(javaScript实现)
    7-3 打怪升级 单源最短路
    Spring6.1之RestClient分析
    NLP(2)--搭建简单的模型(nn)
    Golang | Web开发之Gin框架快速入门基础实践
  • 原文地址:https://blog.csdn.net/LQEmptycity/article/details/126688329