• 【C++】set & map的使用


    关联式容器

    关联式容器也是用于存储数据的,其与序列式容器不同,内部存储的是键值对结构的数据,且在数据检索方面比序列式容器效率要更高。

    键值对

    键值对是用来表示具有一一对应关系的一种结构,这种结构一般只包含有两个成员变量:key 和 value。
    key 代表键码,value 表示与 key 所对应的信息。
    SGI-STL(stl_pair.h)中对pair(键值对)结构的定义如下:

    template <class T1, class T2>
    struct pair {
      typedef T1 first_type;
      typedef T2 second_type;
    
      T1 first;
      T2 second;
      pair() : first(T1()), second(T2()) {}
      pair(const T1& a, const T2& b) : first(a), second(b) {}
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    树形结构的关联式容器

    STL中总共实现了两种不同结构的关联式容器:树型结构与哈希结构。
    树型结构的关联式容器主要介绍四种:set,multiset,map,multimap
    这四种容器的共同点是:在底层都是用红黑树实现的,都是默认按照小于的方式进行元素的比较。
    而set和map具有排序+去重的作用。

    set

    在这里插入图片描述
    向set中插入元素时,只需插入value即可,但在底层实际存储的是由构成的键值对。
    set中的元素默认是按照小于来比较的,使用set的迭代器遍历set中的元素,可以得到一个有序序列。

    set成员函数常用功能介绍

    1. Constructor
    函数声明功能介绍
    set (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());构造空的set
    set (InputIterator first, InputIterator last, const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());用[first, last)迭代器区间中的元素构造set
    set (const set& x);拷贝构造
    1. Iterators
    函数声明功能介绍
    iterator begin();返回set起始位置元素的迭代器
    iterator end();返回set末尾位置元素下一个位置的迭代器
    reverse_iterator rbegin();返回set末尾位置元素下一个位置的迭代器
    reverse_iterator rend();返回set起始位置元素的迭代器
    const_iterator cbegin() const;返回set起始位置元素的const迭代器
    const_iterator cend() const;返回set末尾位置元素下一个位置的const迭代器
    const_reverse_iterator crbegin() const;返回set末尾位置元素下一个位置的const迭代器
    const_reverse_iterator crend() const;返回set起始位置元素的const迭代器
    1. Capacity
    函数声明功能介绍
    bool empty() const;set为空返回true, 否则返回false
    size_type size() const;返回set中有效元素的个数
    1. Modifiers
    函数声明功能介绍
    pair insert (const value_type& val);在set中插入元素val,实际插入的是构成的键值对。如果插入成功,返回<元素在set中的位置, true>,如果插入失败,即val在set中已经存在,返回
    void insert (InputIterator first, InputIterator last);向set中插入[first, last)迭代器区间中的元素
    void erase (iterator position);删除position位置的元素
    size_type erase (const value_type& val);删除set中的val元素,并返回删除元素的个数
    void erase (iterator first, iterator last);删除set中[first, last)迭代器区间的元素
    void swap (set& x);两个set对象变量进行交换
    void clear();将set中的元素清空
    1. Operations
    函数声明功能介绍
    iterator find (const value_type& val) const;找到了返回set中值为val的元素的位置,否则返回end()
    size_type count (const value_type& val) const;返回set中值为val的元素的个数
    iterator lower_bound (const value_type& val) const;返回大于等于val元素位置的迭代器
    iterator upper_bound (const value_type& val) const;返回小于val元素位置的迭代器

    map

    在这里插入图片描述
    key:键值对中key的类型。map中的key是唯一的,且不能修改。
    T:键值对中value的类型。

    map成员函数常用功能介绍

    1. Constructor
    函数声明功能介绍
    map (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());构造一个空的map
    map (InputIterator first, InputIterator last, const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());用[first, last)迭代器区间中的元素构造map
    map (const map& x);拷贝构造
    1. Iterators

    与set的迭代器功能类似。

    1. Capacity

    与set的容量操作功能类似。

    1. Element access
    函数声明功能介绍
    mapped_type& operator[] (const key_type& k);map中有这个k,返回value的引用,相当于查找+修改;map中没有这个k,会插入一个pair(key, V()),返回value的引用,相当于插入+修改
    mapped_type& at (const key_type& k);与operator[]功能类似,不同的是,k不存在时是直接抛异常
    mapped_type& operator[] (const key_type& k)
    {
        return ( *( ( this->insert( make_pair( k,mapped_type() ) ) ).first ) ).second
    }
    
    • 1
    • 2
    • 3
    • 4
    1. Modifiers
    函数声明功能介绍
    pair insert (const value_type& val);key已经在map中,返回pair(key_iterator, false);key不在map中,返回pair(new_key_iterator, true)
    void insert (InputIterator first, InputIterator last);向map中插入[first, last)迭代器区间中的元素
    void erase (iterator position);删除position位置的元素
    size_type erase (const key_type& k);删除map中k对应的元素,并返回删除元素的个数
    void erase (iterator first, iterator last);删除map中[first, last)迭代器区间的元素
    void swap (map& x);两个map对象变量进行交换
    void clear();将map中的元素清空
    1. Operations
    函数声明功能介绍
    const_iterator find (const key_type& k) const;在map中查找key为k的元素,找到了就返回元素的位置,否则返回end()
    size_type count (const key_type& k) const;返回key为k的元素在map中的个数,这个函数可以用来检测一个key是否在map中
    iterator lower_bound (const key_type& k);返回大于等于k的元素位置的迭代器
    iterator upper_bound (const key_type& k);返回小于k的元素位置的迭代器

    multiset & multimap

    multiset与set的区别是,multiset中的元素可以是重复的,而set中的元素是唯一的。
    multimap与map的区别是:multimap中的key是可以重复的,而map中的key是唯一的。multimap没有重载operator[]操作。

  • 相关阅读:
    jupyter报错解决方案 : 无法将“jupyter”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
    大华海康NVR录像JAVA下载及WEB播放
    2022.12.4 学习周报
    软考整体管理思维导图
    Docker安装nginx+php
    python 不打印elasticsearch/rediscluster等相关的日志
    经典算法学习之---折半插入排序
    Python基础教程:行与缩进正确用法教程
    Qt OpenGL相机系统
    【操作系统】内存管理
  • 原文地址:https://blog.csdn.net/weixin_62172209/article/details/132825347