【STL】 pair/map的简介与用法

发布时间 2023-12-23 10:38:11作者: 綾川雪絵

pair简介:

pair 是一个很实用的"小玩意",当想要将两个元素绑在一起作为一个合成元素、又不想要因此定义结构体时,使用 pair 可以很方便地作为一个代替品。

pair 实际上可以看作一个内部有两个元素的结构体,且这两个元素的类型是可以指定的,如下面的短代码所示

struct pair {
    typename first;
    typename second;
}name;
  1. pair的使用

要使用 pair,应先添加头文件 #include <utility> ,然后就可以使用了。

注意:由于 map 的内部实现中涉及 pair,因此添加 map 头文件时会自动添加 utility 头文件,此时如果需要使用 pair,就不需要额外再去添加 utility 头文件了。因此,记不住 utility 拼写的,可以偷懒地用 map 头文件来代替 utility 头文件。

pair 有两个参数,分别对应 first 和 second 的数据类型,它们可以是任意基本数据类型或容器。

pair<typename1,typename2> name

如果想在定义 pair 时进行初始化,只需要跟上一个小括号,里面填写两个想要初始化的元素即可:

pair<int, string>(000, "student_zero")

或者也可使用

make_pair(v1,v2)// 以v1和v2的值创建一个新的pair对象,其元素类型分别是v1和v2的类型

    2. pair 中元素的访问

可以使用结构体的方法访问:

name.first访问第一个,name.second访问第二个

   3、pair 常用函数实例解析

比较操作数

两个pair 类型数据可以直接使用 =、!=、<、<=、>、>= 比较大小,比较规则是先以 first 的大小作为标准,只有当 first 相等时才去判别 second 的大小。

 

Map简介:

map是STL的一个关联容器,它提供一对一的hash

  • 第一个可以称为关键字(key),每个关键字只能在map中出现一次;
  • 第二个可能称为该关键字的值(value);

自动建立Key -value的对应。key 和value可以是任意你需要的类型。

根据key值快速查找记录,查找的复杂度基本是Log(N),(查找的实现原理是二分吗?)如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。

快速插入Key - Value 记录。

快速删除记录 根据Key 修改value记录。 

遍历所有记录。

 

map內部的实现自建一颗红黑树,这颗树具有对数据自动排序的功能。在map内部所有的数据都是有序的

 

     1.map的使用

  1. 必须导入包
#include<map>

      2.定义map对象

map<typename1,typename2> name //第一个是key,第二个是value

     3.map的访问

//可以通过下标访问
name[1] = "student01";
//也可以通过迭代器访问
map<char,int>maps;
   maps['d']=10;
   maps['e']=20;
   maps['a']=30;
   maps['b']=40;
   maps['c']=50;
   maps['r']=60;
   for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++)
   {
       cout<<it->first<<" "<<it->second<<endl;
   }

    4.map的常见用法

1.insert() (插入元素)

map<int,string> mapString;
//通过insert()插入
mapString.insert(pair<int,string>(01,"student01"));
mapString.insert(map<int, string>::value_type(001, "student_one"));
//通过数组插入
mapString[01] = "student01';

即当map中有这个关键字时,insert操作是不能在插入数据的,但是用数组方式就不同了,它可以覆盖以前该关键字对应的值 。

那么我们如何知道insert是否插入成功呢?

// 构造定义,返回一个pair对象
pair<iterator,bool> insert (const value_type& val);
 
pair<map<int, string>::iterator, bool> Insert_Pair;
 
Insert_Pair = mapString.insert(map<int, string>::value_type (01, "student01"));
 
if(!Insert_Pair.second)
    cout << ""Error insert new element" << endl;

2.find()

// find 返回迭代器指向当前查找元素的位置否则返回map::end()位置(原理是二分吗?)
map<string,int>::iterator iter;
iter = mapStudent.find("123");
 
if(iter != mapStudent.end())
       cout<<"Find, the value is"<<iter->second<<endl;
else
   cout<<"Do not Find"<<endl;

 3.erase

//迭代器刪除
iter = mapStudent.find("123");
mapStudent.erase(iter);
 
//用关键字刪除
int n = mapStudent.erase("123"); //如果刪除了會返回1,否則返回0
 
//用迭代器范围刪除 : 把整个map清空
mapStudent.erase(mapStudent.begin(), mapStudent.end());
//等同于mapStudent.clear()

4.size

//如何知道map映射了几次
int nSize = mapStudent.size();

 

下面是各种杂七杂八的东西:

     begin()         返回指向map头部的迭代器

     clear()        删除所有元素

     count()         返回指定元素出现的次数, (帮助评论区理解: 因为key值不会重复,所以只能是1 or 0)

     empty()         如果map为空则返回true

     end()           返回指向map末尾的迭代器

     equal_range()   返回特殊条目的迭代器对

     erase()         删除一个元素

     find()          查找一个元素

     get_allocator() 返回map的配置器

     insert()        插入元素

     key_comp()      返回比较元素key的函数

     lower_bound()   返回键值>=给定元素的第一个位置

     max_size()      返回可以容纳的最大元素个数

     rbegin()        返回一个指向map尾部的逆向迭代器

     rend()          返回一个指向map头部的逆向迭代器

     size()          返回map中元素的个数

     swap()           交换两个map

     upper_bound()    返回键值>给定元素的第一个位置

     value_comp()     返回比较元素value的函数

 

map内部排序的实验:

#include<iostream>
#include<map>
using namespace std;

int main() {
map<int,int> Test;

Test[1000] = 3;
Test[4] = 1;
Test[23] = 2;


map<int,int>::iterator it;
for (it = Test.begin();it != Test.end();it++)
cout <<it->first<<" "<<it->second<<endl;

return 0;
}

output:

4 1
23 2
1000 3