返回顶部

C++ map 学习笔记

std::map

以下内容大多来自此处,并将其中内容做了简化,想详细了解的可点击该链接进行了解和学习。

定义于头文件<map>

std::map 是有序键值对容器,它的元素的键是唯一的。用比较函数 Compare 排序键。搜索、移除和插入操作拥有对数复杂度。 map 通常实现为红黑树。在每个标准库使用比较 (Compare) 概念的位置,以等价关系检验唯一性。不精确而言,若二个对象ab 互相比较不小于对方 :!comp(a, b) && !comp(b, a) ,则认为它们等价(非唯一)。所以对于自定义类型,只需要重载小于运算符就可以使用std::map容器。

声明方式:

std::map<int , int>mp;//声明一个由int到int的map映射
std::map<long long, vector<int>>mp;//声明一个由long long到vector<int>的映射
std::map<int , map<int , int>>mp;//map嵌套
//声明一般来讲对于值没有要求,但对于键需要重载比较运算符,根据前述,对于自定义类,重载小于运算符即可

元素访问

  • at()

    返回到拥有等于key 的关键的元素被映射值的引用。若无这种元素,则抛出 std::out_of_range 类型异常。

    复杂度:\(O(logn)\)\(n\)为容器的大小。

  • operator []

    若不存在拥有关键 key 的元素,则为到新元素被映射值的引用。否则为到既存的关键等价于 key 的元素的被映射值的引用。也即当访问一个键key时,若std::map中存在该元素,就返回其值的引用;若不存在该元素,则先插入该键key,对应的值为默认值。故向std::map中插入元素可以这样实现:

    std::map<int , float>mp;
    mp[1] = 1.1;//插入了键值对(1 , 1.1)
    mp[1] = 2.1;//将上述的键1的值由1.1修改为2.1
    

    复杂度:\(O(logn)\)\(n\)为容器大小

    上述方法也可以用于判断std::map中是否含有某元素(即map[key] == initVal)但这样在不存在这个元素时会使得std::map::size的值增加一,在实际使用中若需要使用到std::map::size时容易出错。

迭代器

因为std::map是有序容器,所以使用迭代器访问得到的键值对是按照键值排序的。他的所有迭代器同vector,使用方法也相同,不再赘述。

容量

名称和含义都与vector的类似

  • empty()

    若容器为空则为 true ,否则为 false

  • size()

    容器中的元素数量。

  • max_size()

    元素数量的最大值。此值通常反映容器大小上的理论极限。

其他函数

  • clear()

    从容器擦除所有元素。此调用后 size() 返回零。

    复杂度:\(O(n)\)\(n\)map中的元素数量。

  • insert()

    有很多重载,可以参考此页面了解和学习。

  • insert_or_assign()

    C++17的函数,可以参考此页面了解和学习。简单来说其功能为:插入元素,或若键已存在则赋值给当前元素。

  • try_emplace()

    C++17的函数,可以参考此页面了解和学习。简单来说其功能为:若键不存在则原位插入,若键存在则不做任何事。

  • erase()

    可以参考此页面了解和学习。简单来说其功能为:从map中擦除元素。

  • swap()

    将内容与 other 的交换。不在单独的元素上调用任何移动、复制或交换操作。

    复杂度:\(O(1)\)

  • merge()

    C++17的函数,可以参考此页面了解和学习。简单来说其功能为:从另一容器接合结点。

    复杂度:\(Nlog(size() + N)\)\(N\)为一个map中的结点数量。

  • count()

    返回拥有关键比较等价于指定参数的元素数,因为此容器不允许重复故为 1 或 0。该方法不会向map中插入一个键值对,所以在需要判断一个map里面是否含有键key时可以使用该方法。

    复杂度:\(O(logn)\)\(n\)map中的元素数量

  • find()

    寻找键等于key的元素。若存在返回对应的迭代器,否则返回end()。该方法也可用于判断是否存在某个键。

    复杂度:\(O(logn)\),含义同上

  • contains()

    C++20函数,判断map中是否存在键key,返回值为bool值。

    复杂度:\(O(logn)\),含义同上

  • equal_range()

    返回容器中所有拥有给定关键的元素范围。范围以二个迭代器定义,一个指向首个不小于 key 的元素,另一个指向首个大于 key 的元素。首个迭代器可以换用 lower_bound() 获得,而第二迭代器可换用 upper_bound()获得。

  • lower_bound()

    指向首个不小于 key 的元素的迭代器。若找不到这种元素,则返回尾后迭代器end()

  • upper_bound()

    指向首个大于 key 的元素的迭代器。若找不到这种元素,则返回尾后迭代器end()

posted @ 2022-04-15 10:59  cherish-lgb  阅读(59)  评论(0编辑  收藏  举报