STL容器----map与set

map和set的都是关联容器,底层实现都是红黑树

一、map映射

  存储键值对 实例化时需要传递两个类型 一个键key的类型 另外一个是值value类型
    key唯一 相同的key只会存在一条记录
    key有序 插入指定位置 遍历时 有序
  (1)插入
    pair<iterator, bool> insert( const pair<KEY_TYPE,VALUE_TYPE> &val );
    pair<KEY_TYPE,VALUE_TYPE>(key,value); 创建一个键值对 对象 pair
      有两个属性 first second
      访问first 访问到的是key的值
      访问second 访问到的是value的值
        pair<string,int> p("张三",111);
        p.first === "张三"
        p.second === 111
    make_pair(key,value);通过key和value创建一个键值对 对象
    insert(pair<key_type,value_type>(key,value);
    insert(make_pair(key,value);
    map[key] = value;
    insert 插入时 如果key重复则插入失败
    insert返回的是一个pair<iterator,bool> 对
    第二个参数true表示插入成功或者false失败
    第一个参数插入成功时指向该记录的迭代器
    [] 如果key不存在则添加 如果存在则更新value

  (2)迭代器                                                                                                                                                                                                                                       
    begin() end()     rbegin() rend()
    map迭代器所指向的数据是一条 key-value 的记录
  (3) size map 中元素的个数 键值对的个数
  (4) empty
  (5) swap
  (6) size_type count( const KEY_TYPE &key ); 返回map中键值等于key的元素的个数
  (7) erase
    void erase( iterator pos );
    void erase( iterator start, iterator end );
    size_type erase( const KEY_TYPE &key );

  (8) find
    iterator find( const KEY_TYPE &key );
    find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器

二、multimap 多重映射
  key可重复
    (1) 查找key值的范围
      pair equal_range( const key_type &key );
      equal_range()函数查找multimap中键值等于key的所有元素,返回指示范围的两个迭代器
      pair<multimap<key_type,value_type>::iterator,multimap<key_type,value_type>::iterator> p
      p.first 指向是第一个为key的迭代器
      p.second 是最后一个为key的下一个元素的迭代器
      iterator upper_bound( const key_type &key );
      upper_bound()函数返回一个迭代器,指向multimap中键值>key的第一个元素

三、set集合

  只有value没有key   ,value不可以重复

四、multiset 多重集合
  value可以重复

五、map和set 的区别

  1.map中的元素是key-value(关键字—值)对:关键字起到索引的作用,值则表示与索引相关联的数据;Set与之相对就是关键字的简单集合,set中每个元素只包含一个关键字。

  2.set的迭代器是const的,不允许修改元素的值;map允许修改value,但不允许修改key。其原因是因为map和set是根据关键字排序来保证其有序性的,如果允许修改key的话,那么首先需要删除该键,然后调节平衡,再插入修改后的键值,调节平衡,如此一来,严重破坏了map和set的结构,导致iterator失效,不知道应该指向改变前的位置,还是指向改变后的位置。所以STL中将set的迭代器设置成const,不允许修改迭代器的值;而map的迭代器则不允许修改key值,允许修改value值。

  3.map支持下标操作,set不支持下标操作。map可以用key做下标,map的下标运算符[ ]将关键码作为下标去执行查找,如果关键码不存在,则插入一个具有该关键码和mapped_type类型默认值的元素至map中,因此下标运算符[ ]在map应用中需要慎用,const_map不能用,只希望确定某一个关键值是否存在而不希望插入元素时也不应该使用,mapped_type类型没有默认值也不应该使用。如果find能解决需要,尽可能用find。

原文地址:https://www.cnblogs.com/jiangyu0331/p/11699296.html

时间: 2024-10-14 22:10:13

STL容器----map与set的相关文章

STL容器 -- Map

核心描述: map 就是从键(key) 到 值(value) 的一个映射.且键值不可重复,内部按照键值排序. 头文件: #include <map> 拓展: multimap 是一个多重映照容器,键值可以重复.unordered_set 是一个内部不排序的映射容器,需包含头文件<unordered_map> 构造方法: map<int, string> kvm; //构造一个键为 int 型, 值为 string 型的 map 元素的插入: kvm[1] = "

GEEK学习笔记— —STL容器map和multimap

简介 在头文件<map> 中定义 namespace std { template <typename Key, typename T, typename Compare = less<Key>, typename Allocator = allocator<pair<const Key,T> > > class map; template <typename Key, typename T, typename Compare = less

STL - 容器 - Map(二)

把Map用作关联式数组 MapAdvanceTest.cpp #include <map> #include <string> #include <iostream> #include <iomanip> #include "MapAdvanceTest.h" #include "../../Core/ContainerUtil.h" using namespace std; void MapAdvanceTest::

83.Remove Duplicates from Sorted List(删除链表重复元素,STL容器map)

Given a sorted linked list, delete all duplicates such that each elementappear only once. For example, Given 1->1->2, return 1->2. Given 1->1->2->3->3, return 1->2->3. HideTags Linked List #pragma once #include<iostream> #

137.Single Number II(法1排序法2STL容器map哈希法3位运算法4改进的位运算)

Given an array of integers, every element appears three timesexcept for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you implement itwithout using extra memory? HideTags Bit Manipulation #pragma once

STL容器用法速查表:list,vector,stack,queue,deque,priority_queue,set,map

STL容器用法速查表:list,vector,stack,queue,deque,priority_queue,set,map   list vector deque stack queue priority_queue set [unordered_set] map [unordered_map] multimap [unordered_multimap]     contiguous storage double-ended queue LIFO FIFO 1st is greatest  

STL容器——对map排序

STL容器(三)——对map排序 对于map的排序问题,主要分为两部分:根据key排序:根据value排序.下面我们就分别说一下~ 1. 根据key进行排序 map默认按照key进行升序排序 ,和输入的顺序无关.如果是int/double等数值型为key,那么就按照大小排列:如果是string类型,那么就按照字符串的字典序进行排列~ (还记得之前说过的字典序吗?当时我们用到了next_permutation这个库函数!)下面我们展示一个例子,说明map中默认按照key升序排列 的情况. Exam

STL中map与hash_map容器的选择

[转]STL中map与hash_map容器的选择 先看看alvin_lee 朋友做的解析,我觉得还是很正确的,从算法角度阐述了他们之间的问题! 实际上这个问题不光C++会遇到,其他所有语言的标准容器的实现及选择上都是要考虑的.做应用程序你可能觉得影响不大,但是写算法或者核心代码就要小心了.今天改进代码,顺便又来温习基础功课了. 还记得Herb Sutter那极有味道的<C++对话系列>么,在其中<产生真正的hash对象>这个故事里就讲了map的选择.顺便回顾一下,也讲一下我在实用中

STL之map容器的详解

一.关于map的介绍 map是STL的 一个容器,和set一样,map也是一种关联式容器.它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键 字的值)的数据处理能力,由于这个特性,有助于我们处理一对一数据.这里说下map内部数据的组织,map内部是自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的.学习map我们一定要理解什么是一对一的数据映射?比如:一个班级中,每个学生的学号跟他的姓名