常用C++STL总结

常用C++STL总结

一、vector,变长数组,倍增思想

size() 返回元素个数
empty() 返回是否为空
front()/back() 返回数组的头或者尾
push_back() 尾部插入元素
pop_back() 尾部删除元素
迭代器:begin()/end()
支持随机寻址:[]

支持比较运算

vector是按照字典序来进行比较的

	vector<int>a(3,4);
	vector<int>b(4,3);
	if(a > b) puts("Yes");//Yes
	else puts("No");

三种遍历方式

	vector<int>v;
	for(int i=0;i<v.size();i++)
	{
		cout<<a[i]<<' ';
	}
	cout<<endl;
	for(vector<int>::iterator i = v.begin();i!=v.end();i++)//auto i = v.begin()
	{
		cout<<*i<<" ";
	}
	cout<<endl;
	for(auto x:v)
	{
		cout<<x<<" ";
	}
	cout<<endl;

二、pair< , >二元组模板

pair<string,int>
first,第一个元素
second,第二个元素
支持比较运算,以first为第一关键字,以second为第二关键字(字典序)

初始化方式

	pair<string,int>p;
	p = make_pair("yxc",18);
	p = {"yxc",18};
	pair<string,pair<string,int>>pp1;

三、string字符串

size()/length()
empty()
clear()

支持自加操作

	string s = "yxc";
	s+='n';
	s+="nb";
	cout<<s<<endl;//yxcnnb

substr()子串

substr(起始位置,子串长度):返回起始位置开始,固定长度的字符
substr(起始位置):返回起始位置开始的所有字符

四、queue队列

push()
front()
back():返回队尾元素
pop()
size()
empty()
没有clear()函数,清空时需要重新构造

五、priority_queue优先队列(堆)

priority_queue,默认是大根堆
push() 插入一个元素
top() 返回堆顶元素
pop() 弹出堆顶元素

定义小根堆

法1
	priority_queue<int,vector<int>,greater<int>>heap; 
法2:插入相反数
	priority_queue<int>heap;
	heap.push(-x);

六、stack 栈

push()
pop()
top()
empty()
size()
没有clear()函数,清空时需要重新构造

七、deque 双端队列

size()
empty()
clear()
front()
back()
push_back()
pop_back()
push_front()
pop_back()
迭代器:begin()/end()
支持随机寻址:[ ]
一般情况下不使用deque,因为效率非常低

八、set /multiset 集合

set里没有重复元素,插入重复元素时自动忽略
multiset里支持重复元素

insert():插入一个数
size()
empty()
clear()
find():查找一个数,若不存在返回end迭代器
count():返回某个数的出现次数
erase()
(1)输入是一个数x,删除所有x O(k + logn);k是x的个数
(2)输入一个迭代器,删除这个迭代器
lower_bound(x):返回大于等于x的最小的数
upper_bound(x):返回大于x的最小的数

九、map/multimap 键值对容器

insert() 插入的数是一个pair
erase() 输入的参数是pair 或者迭代器
find()
size()
empty()
clear()
begin()/end() ++ - - 返回前驱和后继
[ ] 时间复杂度是 O(logn)
lower_bound(x):返回大于等于x的最小的数
upper_bound(x):返回大于x的最小的数

unordered_set,unordered_map,unordered_multiset,unordered_multimap,哈希表
和上面类似,增删改查的时间复杂度都是O(1)
不支持lower_bound()/upper_bound()

#include <map>
#include <string>
using namespace std;
...
map<string, string> namemap;
//增加。。。
namemap["岳不群"]="华山派掌门人,人称君子剑";
namemap["张三丰"]="武当掌门人,太极拳创始人";
namemap["东方不败"]="第一高手,葵花宝典";
...
//查找。。
if(namemap.find("岳不群") != namemap.end()){
        cout<<"Find!<<endl;
}

十、bitset 压位

比如要把1024个bool变量(1024字节)压位为1024个1bit的变量(256字节),可以节省很多空间

方法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值