pair简介:
pair 是一个很实用的"小玩意",当想要将两个元素绑在一起作为一个合成元素、又不想要因此定义结构体时,使用 pair 可以很方便地作为一个代替品。
pair 实际上可以看作一个内部有两个元素的结构体,且这两个元素的类型是可以指定的,如下面的短代码所示
struct pair {
typename first;
typename second;
}name;
-
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的使用
- 必须导入包
#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
map容器默认排序规则为 按照key值进行 从小到大排,也可以自定义,但是我没学()以后再说
标签:返回,map,mapStudent,STL,元素,value,pair From: https://www.cnblogs.com/Yukie/p/17922731.html【C++每日知识点】map<Key,Value>、multimap<Key,Value> 和 unordered_map<Key,Value> - 知乎 (zhihu.com)