美文网首页
C++ STL容器之 map

C++ STL容器之 map

作者: Ivan_Lan | 来源:发表于2018-11-27 22:37 被阅读7次

map 是一种有序无重复的关联容器。

关联容器与顺序容器不同,他们的元素是按照关键字来保存和访问的,而顺序元素是按照它们在容器中的位置保存和访问的。

map保存的是一种 key - value 的pair对象,其中 key 是关键字,value 是关键字对应的值。通过 key找到对应的 value。map中按照 key的大小升序排列pair对象。

typedef pair<const Key, T> value_type

其中key 是 const的,即不可以改变map中的key。

在map中定位特定的元素比 unordered_map 要慢,因为在 map中需要根据 key的大小进行顺序查找。但是在map中允许直接选取一定范围的元素.

map在底层通常用二叉搜索树实现。

  • 迭代器

begin, end, rbegin, rend

cbegin, cend, crbegin, crend

map 的迭代器支持 ++, -- 操作,但是不支持 +i 操作。

注意 map中是根据 key的值来排列元素的位置的,所以通过迭代器遍历出来的结果顺序,可能和插入值的顺序不同。

另外对 map的迭代器解引用的结果是得到一个 pair类型的对象。它有两个共有成员 first, second。first保存 key的值,second 保存value的值。

由于map的 key 是 const的,所以得到的 pair 的first 也是const 的。

  • 成员函数

容量

empty()  // 如果map 为空,返回true。否则返回 false

   // bool empty() const noexcept;

size()    // 返回map 中元素的大小,即 key-value 的个数

   // size_type size() const noexcept;

max_size()    // 返回由于存储空间的限制,map有可能包含的最大元素数。但不保证一定能达到这个数量,有可能在中途申请空间失败。

    // size_type max_size() const noexcept;

元素访问

操作符[]  // m[k] 返回map 中 Key为 k的元素的value的引用。

      // 如果 k不存在,那么将会插入一个 key为 k的元素,并返回其默认 value。

      // []操作总会将 map的大小 +1

      // 注意,对于map,解引用迭代器得到 pair,操作符[]得到 value

at()    // m.at(k) 返回map中Key为k的元素的value的引用。

     // 如果k不存在,抛一个 out_of_range 异常。

    // 使用 at 不会添加元素,不会增加 map的大小

修改

insert  插入

   (1) pair<iterator, bool> insert(const pair<key, value> &val);

 // 单个值插入,参数为 pair类型,first 为 key, second为 value

 // 返回值也是一个 pair,first为插入后的 iterator,second 为bool类型, true表示插入成功,false 表示插入失败

 // 插入失败是因为 map 中已经有一个 key 与输入相同。这次插入操作对map 不会有任何影响, 失败时返回值的 first指向已有的key-value

    (2) iterator insert(const_iterator pos, const pair<key, value> &val);

 // 提示值插入

 // 从 pos 指定的位置开始查找 val应该插入的位置

// 如果设定值合适,可以减少插入时做查找的时间

    (3) void insert(iterator first, iterator second);

// 范围插入,插入[first, second)范围内的内容

    (4) void insert(initializer_list<value_type> il);

// 初始化列表插入

emplace  高效插入

和 insert的主要区别在于,insert首先构造一个临时 value_type对象,再copy到 map中。

 而emplace 是直接在map里根据参数构造 value_type对象。更高效。

 pair<iterator, bool> emplace(key k, value v);

返回值与 insert情况相同。

emplace_hint  提示位置的高效插入

iterator emplace(const iterator pos, key k, value v);

从pos开始查找应该插入的位置,其余和 emplace相同。

erase  删除

    (1) iterator erase(const_iterator position);  // 删除迭代器指向的内容, 函数返回 NULL

    (2) iterator erase(const_iterator first, const_iterator last);  // 删除迭代器范围内的内容,函数返回NULL

    (3) size_type erase(const key_type &k);   // 删除 type 为k的元素,返回删除的数目。对于 map,成功删除返回1,k不存在则返回0

    (4) 1,2中如果迭代器无效,会产生 undefined behavior

swap  交换两个 map对象的内容

    (1) void swap(map &x)

    (2) void swap(map &x1, map &x2)  // 非成员重载函数

clear  清空一个容器的所有元素

void clear() noexcept;

操作

find  查找

   在map中查找key 为 k的元素,返回指向它的迭代器。若k不存在,返回 map::end.

   // iterator find(const key_type &k);

count  计数

   统计map中 key为k的元素的个数,对于map,返回值不是1(存在),就是0(不存在)

    // size_type count(const key_type &k) const;

相关文章

  • STL源码解析(1)-红黑树

    STL源码解析(1)-红黑树 STL容器之红黑树实现 C++中map和set都是基于红黑树的实现, 其迭代器也是红...

  • C++ STL容器之 map

    map 是一种有序无重复的关联容器。 关联容器与顺序容器不同,他们的元素是按照关键字来保存和访问的,而顺序元素是按...

  • STL容器之map和unordered_map

    STL容器之map和unordered_map map和unordered_map的作用 提供了key-value...

  • [C++] STL 容器

    参考:[C++] STL 容器 (一) - 基本介紹[C++] STL 容器 (二) - Iterator 部分示例:

  • C++STL整理

    C++ STL中最基本以及最常用的类或容器string、vector、set、list、map string 处理...

  • c++ STL

    c++ STL是开发中经常使用的。 常见的一些容器有 vector、array、deque、map、unorder...

  • 4. 入门并实践STL——map篇

    map map可以将任何基本类型(包括stl容器)映射到任何基本类型(包括stl容器) map的键是唯一的, 如果...

  • map hash_map(挖坑)

    学习内容来自C++ STL中哈希表 hash_map 未学C++之哈希表的使用 map 使用count,返回的是被...

  • STL容器之map/multimap

    构造函数 赋值操作 大小操作 删除 查找 实例 multimap

  • C++ STL(1)

    C++ STL(1) from my csdn blog C++标准模板库 容器C++标准模板库提供了10种容器基...

网友评论

      本文标题:C++ STL容器之 map

      本文链接:https://www.haomeiwen.com/subject/xifoqqtx.html