算法中常见的STL容器

算法中常见的STL容器

pair

常用的模板,存储二元组,排序时,以first为第一关键字,以second为第二关键字(字典序),即先按first排序,first相同的按second排序

pair<int,string> p;
pair<int,string> p(1,"123");
p.make_pair(1,"123");  
p = {2,"1223"};        //c++11支持的赋值方式
p.first = 1;  //第一个元素
p.second = "124"; //第二个元素
pair<int,pair<int,int>> p; //存储三个元素

vector

变长数组,基本思想是倍增,每次当容量不够时,申请一个当前容量两倍的空间,并进行copy

系统为某一程序分配空间时,所需时间与空间大小无关,与申请次数有关,所以变长数组要减少申请空间的次数。

常用接口:

v.size();   //返回元素个数,时间复杂度为1
v.empty();  //返回是否为空,时间复杂度为1
v.clear();  //清空
v.front();  //返回vector第一个数
v.back();   //返回vector最后一个数
v.push_back(); //向vector插入一个数
v.pop_back();  //最后一个数删掉 
v.begin()/v.end(); //开始结束迭代器 
//vector 支持比较运算  
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;
int main()
{
    vector<int> v;
    for (int i = 0; i < 10; i++) v.push_back(i);
    for (int i =0; i < v.size(); i++) cout << v[i] << ' ';   //下标遍历
    cout << endl;  
    for (vector<int>::iterator it = v.begin(); it != v.end(); it++) cout << *it << ' ';   //迭代器遍历
    cout << endl;
    for (auto x : v) cout << x << ' ';  //c++ 11 特性
    cout << endl;
    vector<int> v1(4,3), v2(3,4);   
    if (v1 < v2) puts("v1 < v2");  //按照字典类型进行比较
    return 0;
}

string

字符串,substr( ), c_str( )

s.size()/s.length;  //返回字符串长度
s.empty();
s.clear();
s1 += s2;  //支持加运算符,进行字符串的拼接
s.substr(idx,len);  //返回,从下标idx开始,长度为len的字符串,当len很长或忽略直接输出从idx到结尾的子串
printf("%s\n",s.c_str());  //输出字符串,c_str() 返回子符串的首地址

queue

队列

q.size();
q.empty();
q.push();   //队尾插入元素
q.front();  //返回队头元素
q.back();   //返回队尾元素
q.pop();    //队头弹出
q = queue<int>()  //清空队列

priority_queue

优先队列,堆,默认大根堆,需要引入queue头文件

push();  
top();  //返回堆顶元素
pop();  //弹出堆顶元素
priority_queue<int,vector<int>,greater<int>> heap;   //强行定义小根堆

stack

栈,push( )入栈, pop( )出栈, top( )返回栈顶

size();
empty();
push();  //向栈顶插入元素
top();   //返回栈顶元素
pop();   //弹出栈顶元素

deque

双端队列,队头队尾都可以插入弹出,可以随机访问,速度慢

size();
empty();
clear();
front();
back();
push_back();
pop_back();
push_front();
pop_front();
begin()/end()

set,map,multiset,multimap

基于平衡二叉树(具体用的红黑树),动态维护有序序列

size();
empty();
clear();
begin()/end();   //支持++ --  返回前驱和后驱
set/multiset:
	insert();   //插入一个数
	find();     //查找一个数
	count();    //返回某一个数的个数
	erase();
			(1) 输入是一个数x,删除所有x,O(k + logn) k是x的个数
             (2) 输入是一个迭代器,删除这个迭代器所指的数
	lower_bound();   //返回大于等于x的最小的数的迭代器
	upper_bound();   //返回大于x的最小的数的迭代器,不存在返回end()
map/multimap:
	insert();  //插入的是一个pair
	erase();   //输入的参数是pair或者迭代器
	find(); 
    []
	lower_bound();   
	upper_bound();   
#include <iostream>
#include <map>
using namespace std;
int main()
{
    map<string,int> a;
    a["xld"] = 1;        //map可以直接像数组用,但是时间复杂度  O(logn)
    cout << a["xld"] << endl;
}

unordered_set,unordered_map,unordered_multiset,unordered_multimap

基于哈希表实现,内部无序

和上面类似,增删改查的时间复杂度为O(1)

缺点:不支持:lower_bound(); upper_bound();以及迭代器的++,-- 凡是和排序相关的操作都不支持

bitset

压位,可以省8位空间

bitset<10000> s;
~,&,|,^;
>>,<<;
==,!=;
[];
count();  //返回有多少个1
any();    //判断是否至少有一个1
none();   //判断是否全为0
set();    //把所有位置乘1
set(k,v); //将第k位变成v
reset();  //把所有位变成0
flip();   //把所有位取反  等价于~
flip(k);  //将第k位取反
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值