C++ STL
//学习自AcWing
1.vector 变长数组 倍增
系统为某一程序申请空间时,与空间大小无关,与申请次数有关。开1000个1比直接开1个大小1000慢
空间不够时 再开为原来两倍的数组 开辟空间次数是O(log(n))然后 插入n个元素操作 copy的次数平均来看是O(1)
#include <iostream>
#include <vector>
using namespace std;
int main()
{
// vector<int>a(10);//开一个长度为10的数组
// vector<int>a[10]; 开10个vector
vector<int>a(10,3);//长度为10,元素全是3的数组
for(auto x: a)cout<<x<<" ";//遍历a中所有元素 (常用)
cout<<endl;
for(int i=0;i<a.size();i++)a[i]=i;
//用vector迭代器遍历
for(vector<int>::iterator i=a.begin();i!=a.end();i++)cout<< *i <<" ";//*解 引用
cout<<endl;
//可用auto替换
for(auto i=a.begin();i!=a.end();i++)cout<< *i <<" ";
cout<<endl;
//c++11基于范围遍历
for(auto x : a)cout<< x <<" ";//x是a中的元素
cout<<endl;
/*
a.size()大小
a.empty()空不空
a.clear();清空
a.front(),a.back();返回第一个、最后一个元素
a.push_back(),a.pop_back()压入弹出元素
a.begin(),a.end(); begin是第0个元素 end是最后一个元素后面一个元素
支持字典序比较
*/
// vector <int>b(4,3),c(3,4);
//if(b<c)puts("b<c");
//b是小于c的
return 0;
}
2.pair
pair <int,int>p;
pair <int,pair<int,int>>p;
pair <int,int>p[N];
p.first第一个元素,p.second第二个元素
初始化 p=make_pair(1,2);或p={1,2}; //C++11
sort(p,p+n) //按first字典序排序 从小到大
2.string 字符串
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
string a="012";
a+="34";
/*
substr(开始位置,长为多少)
c_str() 返回string对应字符数组的头指针
*/
cout<<a.substr(0,4)<<endl;//输出 0123
cout<<a.substr(2)<<endl;//输出位置2以后的 234
cout<<a.substr(0,10)<<endl;//输出到末尾 01234
printf("%s",a.c_str());//输出 01234
/*
char c[20];
string s="1234";
c_str()是临时指针
strcpy(c,s.c_str()); 是为了与c语言兼容
这段摘抄自https://blog.csdn.net/Nancy_m/article/details/7583550
*/
return 0;
}
3.queue队列
empty() size()
pop()弹出队头
push()压入队尾
front(),back()
queue
q=queue
4. priority_queue优先队列 (堆)
#include <iostream>
#include <vector>
#include <utility>
#include <queue>
using namespace std;
int main()
{
//priority_queue<int>q; //默认大根堆 即根节点最大 所有左右儿子节点都要比父亲节点小
//push() top()返回堆顶元素 pop();
//小根堆实现方法
//1.插入元素的时候取负数
//q.push(-x);
//2.直接定义小根堆
priority_queue <int,vector<int>,greater<int>>q;
return 0;
}
5.stack 栈
size empty top push pop
不常用 要添加头文件
6.deque() 双端队列
加强版vector 要
#include <iostream>
#include <deque>
using namespace std;
int main()
{
deque <int>q;
/*
size() empty() clear() front() back()
[]随机访问
push_back(),pop_back() 队尾操作
push_front(),pop_front() 队头操作
*/
return 0;
}
- set map multiset multimap基于平衡二叉树 动态维护有序集合
除了size empty clear其它基本都是O(logn)
#include <iostream>
#include <set>
using namespace std;
int main()
{
set <int>q;
q.insert(1);
if(q.find(1)!=q.end())puts("YES");
/*
set不包含重复元素 multiset可以
insert 插入一个数
find()q.find(1)!=q.end(); //查找元素是否在set 找不到就返回end迭代器
count(x) 返回x的个数 set只可能0,1 multiset可能多个
erase()
1.输入一个数x 删除所有x O(k+logn)
2.输入1个迭代器 删掉这个迭代器
lower_bound()返回大于等于x的最小的数的迭代器 不存在返回end
upper_bound()返回大于x的最小的数
迭代器支持*解除引用 不支持随机访问 支持++ 和-- 复杂度logn 前驱是前一个数 后继是后一个数
*/
return 0;
}
map
#include <iostream>
#include <map>
using namespace std;
int main()
{
map <string,int>a;
a.insert({"666",2});
for(auto x=a.begin();x!=a.end();x++)
{
if(a->second)cout<<a->first;
}
/*
insert pair
erase pair或迭代器
find()
[] 像数组一样 logn 数组是O(1)
*/
cout<<a["666"];
/*
unordered_map 需要头文件
所有增删改查O(1) ,不支持所有排序相关的如lower_bound 迭代器++ --
*/
return 0;
}
8.bitset

浙公网安备 33010602011771号