c++标准库stl 的常见函数

c++标准库stl

一 vector常见用法 (变长数组)
定义 1 vector name;(定义变量) vector name[10]; 定义数组(意思是name【0】-name【9】是变长数组,但是name的长度 定的 )注意和2的区别 2中的是 数组和变量都是变的
定义2 vector<vector > name; 就是变量仍为vector型 相当于二维数组

vector元素的访问
方式一 name【1】, iterator是迭代器的意思
方式二 vector ::iterator=name.begin(); 再用it+i形式访问 it相当于第一个元素的位置(指针功能)

vector常用函数
(1)push_back(x) 在vector后面添加x
(2)pop_back()删除尾元素
(3)size( ) 返回vector元素个数 是unsigned类型 一般可用int型 如 int len=name.size();
(4)clear() name.clear 用于清空变长数组name
(5)insert() vector数组 name={1,2,3,4,5,} 执行 name.insert(name.begin()+2,-1); //将-1插入name【2】的位置
name={1,2,-1,3,4,5}
(6)erase()
①删除单个元素 name.erase(name[3]); or name.erase(name.begin()+3);
②删除一个区间内运输 name.erase(first,last) 删除【first,last)之间的last-first个元素
例:name.erase(name[1],name[4]) 或 name.erase(name.begin()+1,name.begin()+4);

vector的常见用途
(1) 用于数组 在长度不确定时 可以节省空间
(2)在需要输出数据在同一行 ,且数据之间用空格隔开,最后一个数据不隔开时,还不知道数据个数 可用vector保存,而后一次性输出
(3)用邻接表储存图时(后续补充)

二 set的常见用法 使用时include
set翻译为集合,是内部自动有序 且 不含重复元素的容器,因为set本身是一个容器 就是一个变长数组
定义 set name; set name node是结构体类型
定义 set<set > name ,这个和vector的相同

1 set元素的访问
只能用迭代的方式访问 for(set<int>:: iterator it=name.begin() ;it != set.end() ;it ++); 对每一个name里的元素进行操作

2 常用的函数
(1)name.insert(x) 之间插入,自动排序并去除重复
(2)name.find(2) 返回2的迭代器 找不到返回name.end()
(3)name.erase(name.find(100)) 找到100并删除它 或 name.erase(100)
删除一个区间 set::iterator it=name.find(30) ; name.erase(it ,name.end() ); 删除从30到最后的所有元素
(4)name.size()
(5)name.clear()

3常见的用途
①碰到要去除重复并且按升序排序时 可以用set解决
② set中的元素是唯一的 如果要使用不唯一的情况,则使用multiset。(就不会删除重复)
③c++标准中还添加了unordered_set, 以散列代替set内部的红黑树(一种自平衡二叉查找树)实现,实现只去重不排序,速度比set快的多

三 string的常见用法 include
1 定义 string str=“abcd”;
注意 读入或输出整个字符串 只能用cin 和cout ,如果用printf 那要用str.c_str(),把str转换为char型数组 printf("%s\n",str.str());
可用迭代器进行访问 string::iterator it=str.begin()
2常用函数
① string 加法 str3=str1 +str2; 将str2加在str1后面 赋值给str3 也可直接+=;
② 直接比较大小 == <= >=等 按字典序比较
③str.size() or str.length()
④ insert()
用法一: str.insert(3,str2) //在str【3】处插入str2 str2可直接写相应的内容
用法二:str.insert(str.begin()+3,str2.begin(),str2.end() ) 表示截取str2begin到 end部分 插入到str的3的位置
⑤str.erase(str.begin()+4) //删除单个元素 4号位元素
str.erase(str.begin()+4,str.end() ) 4号位到end全删除 包括最后一个
str.erase(pose,length)
⑥ str.clear()
⑦substr.(pos,length) 返回从pos开始 长度为length的子串
⑧string::npos 代表-1 表示是失败
⑨str.find(str1) str1是str的子串 则返回第一个子串的起始位置 否则返回-1
⑩str.replace(pos,len,str2) 从位置pos开始的len替换为str2
str.replace(it1,it2,str2) str2不一定==it2-it1

四 map的常见用法 include
map是映射 可以将任何类型 映射到任何类型 建立2者之间的对应关系
1定义:map<string , int> mp; 需要映射前类型 和 映射后类型 2个type ,建立2者之间的对应关系
2访问 :(1) 下标访问 map<char,int >mp mp[‘c’]=30, 直接通过下标访问 其中mp的键是唯一的,一个mp[‘c’]只对应一个值
(2)迭代器访问 map<char,int>::iterator it, 得到迭代器it 因为有2个type,键和值 所以用it->first表示键 it->second表示值 。
注意:map内部是使用红黑树实现的(同set)会有自动排序功能

3 map的常用函数
① map.find(‘c’) 返回的是一个迭代器 所以定义一个it接受 用用it->first表示键 it->second表示值 输出
②map.erase() 单个元素删除 用it ,map.erase(it), it可用find找到
删除键 用mp.erase(‘c’) c和c对应的值被删除
删除区间元素 mp.erase(it1,it2) 左闭右开
③mp.size()
④mp.clear()

4 map的常见用途
①建立字符串和整数之间的映射 用map比较节省代码量
②判断大整数或者数据 是否存在时 把map当做bool型数组使用即可
③字符串和字符串的映射 ,遇到难以用普通数组映射的数据时 可用map
注意 map的键和值是唯一的 如果一个键对应多个值 则用multimap
同样,unordered_map 可以在不需要排序时使用 速度较快,这一点和set相同

五queue的常见用法
队列(queue)
1 定义: queue q;
2 q.front() 访问队首 q.back() 访问队尾
3 常用函数
①q.push(x)入队 q.pop()队首元素 出队
②q.empty() 判断对空 if(q.empty()==true)
③q.size()
4常见用途
广度优先搜索 不用手动定义 直接用queue 定义
在使用 front和back是 必须先用empty判断是否队空
还有双端队列 (2短皆可进出的队列) 优先队列即priority_queue (在操作系统中应用)

6优先队列 (priority_queue)的常见用法
底层是用堆实现的 ,队首的优先级最高
1定义:priority_queue q,
2访问 只能通过top访问最高级的元素 (队首元素) q.top()
3常用函数
① q.push(x) q.pop()
②q.top()
③q.empty() q.size()

4 内置优先级的设置
(1)基本数据类型(int double 等char是字典序)的优先级设置
①priority_queue q;
②priority_queue <int ,vector ,greater >q; //注意后两个> >之间有一个括号
vector<>的类型名和前面的保持一致 用来存数据的 greater表示小的优先级大,less表示大的优先级大
(2)结构体的优先级设置方法

struct fruit  //在结构体中定义优先级  把数据放入queue中即可
{
	string name;
	int price;
	friend bool operator < (fruit 1,fruit 2)  //重载小于号作用  不用更改   friend表示友元
	{
		return fl.place<f2.place;  //价高优先级高  若要价低,<  改为  >即可   注意这里和sort中的cmp很像  但是是相反的
	}
}f1,f2;

注意:若结构体中的数据比较庞大 使用引用提高效率 (const fruit &f1,const fruit &f2) 就是在原来的基础上 加上 const 和&

5 priority_queue 的常见用途
解决一些贪心问题 也可以对dijkstra算法进行优化 其优先队列就是一个堆
同样,在top()使用前 判断队空!!

七 stack 的常见用法
定义 :stack s;
常用函数 :
①s.push(x) s.pop()
② s.top() 访问栈顶元素
③s.empty() s.size()

常见的用途
用栈模拟函数的递归

八 pair的常见用法 头文件 include
pair的作用是将2个元素结合在一起 ,在不使用struct时 可以用pair

1 定义: pair <typename1 ,typename2 > name;
例:pair <string, int > p; 若定义时初始化 pair <string, int > p (“haha” ,5),直接赋值
2 元素访问
pair中有2个元素 ,p.first 和 p.second;
赋值 p=make_pair(“haha” ,5);
或 p=pair<string, int> (“haha” ,5);
3常用函数
①比较操作数 == <= >= != 等 //先按first比较 后是second

4 常见用途
作为map的键值的插入

map <string ,int > mp;
mp.insert (make_pair<"haha" ,5);//插入一个键值  

九 algorithm头文件下的常用函数
1 max() min( ) abs(x)//返回绝对值,x必须是整数 浮点型用math头文件下的 fabs() 函数
2 swap()
3 reverse(it1,it2) 将元素[it1,it2) 之间的反转 可以是数组 也可以是迭代器
4 next_permutation() 给出一个序列在全排列的 下一个序列 例子在算法笔记234页
5 fill()把数组或容器中的某个区间赋相同的值 fill(a,a+5,233)
6 sort()排序函数
sort(首元素地址,尾元素下一个地址,比较函数 (非必填))
比较函数cmp写法
bool cmp(int a ,int b) {
return a<b;//理解为a<b时,a在前面 就是递增排序
}
结构体写法
bool cmp (node a, node b )
{
return a.x<b.x;
}

7 lower_bound() 和 upper_bound()
lower_bound( first ,last, val) 返回第一个 > val的元素的位置 ,
如果没有 则返回可以插入该元素的值的位置 返回值减去数组起始值就是下标

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值