C++ map、vector、pair

只写一些简单的应用,用于写题

在这里插入图片描述

map

在这里插入图片描述
m a p map map是一对一的
第一个可以称为关键字 ( k e y ) (key) (key),每个关键字只能在 m a p map map中出现一次
可以用于离散化
第二个可以称为该关键字的值 ( v a l u e ) (value) (value)
在这里插入图片描述

构造

m a p < A , B > C map<A, B> C map<A,B>C
A 、 B A、B AB 是关键字的类型,如 i n t 、 s t r i n g 、 d o u b l e 、 p a i r int、string、double、pair intstringdoublepair< >等
C C C m a p map map的名字
其实可以把 m a p map map当成数组用
这个数组可以用于离散化、多用于数组内数字数量不确定
在这里插入图片描述

插入

方法1

map<A, B> C
C.insert(pair<A, B>(A类型的值, B类型的值));
C.insert(make_pair(A类型的值, B类型的值));
#EG · 加入一个单词sunny到11号位置
map<int, string> h;
h.insert(pair<int, string>(11, "sunny"));
h.insert(make_pair(11, "sunny"));

方法2

map<A, B> C
C[A类型的值] = B类型的值;
#EG · 加入一个单词sunny到11号位置
map<int, string> h;
h[11] = "sunny";

两者有一定区别,后者可以完成覆盖操作前者不行

#EG · 如果要把sunny变成windy
h.insert(pair<int, string>(11, "windy"));//h[11]中仍然是sunny
h[11] = "windy";//h[11]为windy

在这里插入图片描述

查找

方法1

B 变量 = C.find(A类型的值);
#EG · 取出11号位置里的值
map<int, string>::iterator  x;  
x = h.find("11");//括号中如果为int,需要加双引号
结果:x == "sunny"//假设我们上面没有覆盖上windy

方法2

B 变量 = C[A类型的值];
#EG · 取出11号位置里的值
string x = h[11];
结果:x == "sunny"//假设我们上面没有覆盖上windy

在这里插入图片描述

刪除与清空

删除的方法1

指针 = C.find(A类型的值);
C.erase(变量)
#EG · 删除11号里的值
map<int, string>::iterator  x;  
x = h.find("11");
h.erase(x);

删除的方法2

bool/int 变量 = C.erase(A类型的值);//如果刪除了会返回1,否则返回0
#EG · 删除11号里的值
h.erase("11"); 

清空

C.erase(C.begin(), C.end());
或者C.clear(;
#EG · 清空h
h.erase(h.begin(), h.end());
或者 h.clear();

在这里插入图片描述

大小

int 变量 = C.size();//返回所有元素总共出现个数
int 变量 = C.count(B类型的值)//返回指定元素出现的次数
#EG · 记录h的大小
int size1 = h.size();
#EG · 记录h中值为windy的个数
int size2 = h.count("windy");

在这里插入图片描述

输出

1
begin()   返回指向map头部的迭代器
end()     返回指向map末尾的迭代器
#EG · 从前往后输出
map<int, string>::iterator  z;  
for(z = h.begin(); z != h.end(); z++)  
   cout<<z->first<<"   "<<z->second<<endl;  
2
rbegin()  返回一个指向map尾部的逆向迭代器
rend()    返回一个指向map头部的逆向迭代器
#EG · 从后往前输出
map<int, string>::reverse_iterator  z;  
for(z = h.rbegin(); z != h.rend(); z++)  
   cout<<z->first<<"   "<<z->second<<endl;

在这里插入图片描述

其他基本操作函数:

注释掉的函数,平时做题基本用不上
   lower_bound()  返回键值>=给定元素的第一个位置
   upper_bound()  返回键值>给定元素的第一个位置
   equal_range()  返回一个pair,第一个变量是lower_bound返回的迭代器,第二个是upper_bound返回的迭代器
   value_comp()   返回比较元素value的函数
   key_comp()     返回比较元素key的函数
   
   empty()        如果map为空则返回true
   swap()         交换两个map
   
   //get_allocator()  返回map的配置器
   //max_size()       返回可以容纳的最大元素个数

在这里插入图片描述

pair

在这里插入图片描述

构造与初始化

pair<T1, T2> p1;         创建一个空的pair对象,它的两个元素分别是T1和T2类型,采用值初始化。
pair<T1, T2> p1(v1, v2); 创建一个pair对象,它的两个元素分别是T1和T2类型
						 其中first成员初始化为v1,second成员初始化为v2。
pair<T1, T2> p2(p1);     拷贝初始化
创建pair对象时,必须提供两个类型名,两个对应的类型名的类型不必相同

在这里插入图片描述

比较

p1 < p2;    两个pair对象间的小于运算,first优先
p1 == p2;  需要first和second都相等

在这里插入图片描述

访问

p1.first();   取出p1中first的值
p1.second();  取出p1中second的值

在这里插入图片描述

生成新的pair对象

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

在这里插入图片描述
在这里插入图片描述

vector

动态数组,严格的线性顺序排序
在这里插入图片描述

构造

vector<类型>标识符
vector<类型>标识符(最大容量)
vector<类型>标识符(最大容量,初始所有值)
vector< vector< int> > A; 还可以构造二维向量

在这里插入图片描述

函数

vector<int> A;
vector<int> B;
int x, z;
bool p;
iterator y;
# EG 在数组的最后添加一个数据 
A.push_back(x); 
# EG 去掉数组的最后一个数据
A.pop_back(); 
# EG 得到编号位置的数据
x = A.at() 
# EG 得到数组头的指针
y = A.begin(); 
# EG 得到数组的最后一个单元+1的指针
y = A.end(); 
# EG 得到数组头的引用
x = A.front(); 
# EG 得到数组的最后一个单元的引用
x = A.back(); 
# EG 得到vector最大可以是多大
z = A.max_size(); 
# EG  当前vector分配的大小
z = A.capacity(); 
# EG 容器中实际数据个数 
z = A.size(); 
# EG 删除指针指向的数据项
A.erase(y); 
# EG 清空当前的vector
A.clear(); 
# EG 将vector反转后的开始指针返回(其实就是原来的end-1)
y = A.rbegin(); 
# EG 将vector反转构的结束指针返回(其实就是原来的begin-1)
y = A.rend(); 
# EG  判断vector是否为空
p = A.empty();
# EG 与另一个vector交换数据
swap(A, B); 
# EG 排序
sort(A.begin(),A.end());从小到大
reverse(A.begin(),A.end());从大到小 

在这里插入图片描述

输出

vector<int> A;
for(int i = 0; i < A.size(); i++)
	cout<<A[i]<<" ";

vector<int>::iterator it;//声明一个迭代器
for(it = A.begin(); it != A.end(); it++)
    cout<<*it<<" ";

while(!A.empty()) {
	int x = A.front();
	A.pop();
	cout<<x<<" ";
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值