美文网首页
C++中的关联式容器map用法

C++中的关联式容器map用法

作者: 冀望的air | 来源:发表于2020-10-28 10:17 被阅读0次

关联式容器是什么

 关联式容器在存储元素值的同时,还会为各元素额外再配备一个值(又称为“键”,其本质也是一个 C++ 基础数据类型或自定义类型的元素),它的功能是在使用关联式容器的过程中,如果已知目标元素的键的值,则直接通过该键就可以找到目标元素,而无需再通过遍历整个容器的方式。
 使用关联式容器存储的元素,都是一个一个的“键值对”( <key,value> ),这是和序列式容器最大的不同。除此之外,序列式容器中存储的元素默认都是未经过排序的,而使用关联式容器存储的元素,默认会根据各元素的键值的大小做升序排序。

关联式容器名称 特点
                                                                     map 定义在 <map> 头文件中,使用该容器存储的数据,其各个元素的键必须是唯一的(即不能重复),该容器会根据各元素键的大小,默认进行升序排序(调用 std::less<T>)。可以快速查找、读取或者删除所存储的元素,同时该类型容器插入元素的效率也比序列式容器高。
set    定义在 <set> 头文件中,使用该容器存储的数据,各个元素键和值完全相同,且各个元素的值不能重复(保证了各元素键的唯一性)。该容器会自动根据各个元素的键(其实也就是元素值)的大小进行升序排序(调用 std::less<T>)。
multimap 定义在 <map> 头文件中,和 map 容器唯一的不同在于,multimap 容器中存储元素的键可以重复。
multiset 定义在 <set> 头文件中,和 set 容器唯一的不同在于,multiset 容器中存储元素的值可以重复(一旦值重复,则意味着键也是重复的)。

pair类模板

pair 类模板定义在<utility>头文件。
考虑到“键值对”并不是普通类型数据,C++STL 标准库提供了 pair 类模板,其专门用来将 2 个普通元素 first 和 second(可以是 C++ 基本数据类型、结构体、类自定的类型)创建成一个新元素<first, second>

map

map 容器存储的都是 pair 对象,也就是用 pair 类模板创建的键值对。各个键值对的键和值可以是任意数据类型,包括 C++ 基本数据类型(int、double 等)、使用结构体或类自定义的类型。(一般情况下,使用string类型做键值对的类型)
需要注意的是,使用 map 容器存储的各个键值对,键的值既不能重复也不能被修改。换句话说,map 容器中存储的各个键值对不仅键的值独一无二,键的类型也会用 const 修饰,这意味着只要键值对被存储到 map 容器中,其键的值将不能再做任何修改。

使用

map 容器定义在<map> 头文件中,并位于 std 命名空间中。

#include <map>  
using namespace std;  

创建方法

1.调用 map 容器类的默认构造函数,可以创建出一个空的 map 容器。

std::map<std::string, int>Map1;  

2.创建时也可以初始化 。

std::map<std::string, int>Map1{ {"C语言",10},{"STL",20} };

3.也可以利用先前已创建好的 map 容器,再创建一个新的 map 容器。

std::map<std::string, int>newMap(Map1);

~这里了解一下吧,当有临时的 map 对象作为参数,传递给要初始化的 map 容器时,此时就会调用移动构造函数。~

#创建一个会返回临时 map 对象的函数
std::map<std::string,int> disMap() {
    std::map<std::string, int>tempMap{ {"C",10},{"STL",20} };
    return tempMap;
}
//调用 map 类模板的移动构造函数创建 newMap 容器
std::map<std::string, int>newMap(disMap());

map容器包含的成员方法

成员方法 功能
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 属性,不能用于修改容器内存储的键值对。
find(key) 在 map 容器中查找键为 key 的键值对,如果成功找到,则返回指向该键值对的双向迭代器;反之,则返回和 end() 方法一样的迭代器。另外,如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
lower_bound(key) 返回一个指向当前 map 容器中第一个大于或等于 key 的键值对的双向迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
upper_bound(key) 返回一个指向当前 map 容器中第一个大于 key 的键值对的迭代器。如果 map 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。
equal_range(key) 该方法返回一个 pair 对象(包含 2 个双向迭代器),其中 pair.first 和 lower_bound() 方法的返回值等价,pair.second 和 upper_bound() 方法的返回值等价。也就是说,该方法将返回一个范围,该范围中包含的键为 key 的键值对(map 容器键值对唯一,因此该范围最多包含一个键值对)。
empty() 若容器为空,则返回 true;否则 false。
size()    返回当前 map 容器中存有键值对的个数。
max_size() 返回 map 容器所能容纳键值对的最大个数,不同的操作系统,其返回值亦不相同。
operator[] map容器重载了 [] 运算符,只要知道 map 容器中某个键值对的键的值,就可以向获取数组中元素那样,通过键直接获取对应的值。
at(key) 找到 map 容器中 key 键对应的值,如果找不到,该函数会引发 out_of_range 异常。
insert() 向 map 容器中插入键值对。
erase() 删除 map 容器指定位置、指定键(key)值或者指定区域内的键值对。后续章节还会对该方法做重点讲解。
swap() 交换 2 个 map 容器中存储的键值对,这意味着,操作的 2 个键值对的类型必须相同。
clear() 清空 map 容器中所有的键值对,即使 map 容器的 size() 为 0。
emplace() 在当前 map 容器中的指定位置处构造新键值对。其效果和插入键值对一样,但效率更高。
emplace_hint() 在本质上和 emplace() 在 map 容器中构造新键值对的方式是一样的,不同之处在于,使用者必须为该方法提供一个指示键值对生成位置的迭代器,并作为该方法的第一个参数。
count(key) 在当前 map 容器中,查找键为 key 的键值对的个数并返回。注意,由于 map 容器中各键值对的键的值是唯一的,因此该函数的返回值最大为 1。

以begin()end()写一个程序。

#include <iostream>  
#include <map> // pair  
#include <string> // string  
u[sin](as)g namespace std;  

int main() 
{  
  //创建并初始化 map 容器  
  std::map<std::string, std::string>myMap{{"STL","a"},{"C语","b"} };

  //调用 begin()/end() 组合,遍历 map 容器  
  for (auto iter = myMap.begin(); iter != myMap.end(); ++iter) {  
    cout << iter->first << " " << iter->second << endl;  
     }  
  return 0;  
}  

文章参考:《C语言中文网》http://c.biancheng.net/view/7169.html

相关文章

  • C++中的关联式容器map用法

    关联式容器是什么  关联式容器在存储元素值的同时,还会为各元素额外再配备一个值(又称为“键”,其本质也是一个 C+...

  • 2020-07-04-《STL学习-001》

    vector、deque、list是序列式容器 set、map是关联式容器 HashTable:哈希表

  • C++ 容器梳理

    C++ 容器包括 顺序存储结构:vector list dequeue关联存储结构:set map multise...

  • C++大厂面试真题

    C++标准库的map和set有什么区别,如何实现的? map和set都是C++的关联容器,其底层实现都是红黑树。 ...

  • JNI基础 -- C++基础知识(容器)

    C++ 中有两种容器 1.序列式容器 2.关联式容器 这两种容器都在stl标准模板库中 序列式容器 序列式容器:元...

  • unordered_map详细介绍

    他是C++ 的一个容器-----unordered_map 他是一个关联容器,内部采用哈希表结构,拥有快速检索功...

  • 标准模板库-map

    标准模板库-map 1. map简介 map是STL中的关联式容器,提供一对一的数据结构,其中第一个称为关键字Ke...

  • 第11章 关联容器

    关联容器分类:set还是map、关键字是否重复、关键字是否有序。 11.1 使用关联容器 map类型通常被称为关联...

  • BAT面试 STL常见面试题

    请你来说一下map和set有什么区别,分别又是怎么实现的?参考回答:map和set都是C++的关联容器,其底层实现...

  • C++ map容器用法

    Posted on Jul 09, 2018 By Keyu Zhao 介绍 Map是键-值对的集合,map中的所...

网友评论

      本文标题:C++中的关联式容器map用法

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