vector
(不定数组)
vector的定义
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int> a(n);
//定义长度为n的不定数组
vector<int> a(n,m);//n为长度,m为所有n个数的初始化的值
// vector<int> a[10]; 也可以
return 0
}
vector的初始化及遍历
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int> a (10,0);
//定义长度为10且都初始化为 0;
//遍历方式
for(auto x:a) cout<< x<<endl;
//一种遍历方式 ,范围遍历c++11特有
for(int i=0;i<a.size();i++){
cout<<a[i];
} //传统遍历
for(auto i=a.begin();i!=a.end();i++)
{
cout<<*i;
}//运用迭代器auto既是vector<int>::iterator;
return 0;
}
支持的函数
//支持的函数
a.size();//返回vector长度
a.empty() //a空返回1;else 返回0;
clear()//清空
front()/back()//返回vector的第一/最后一个的数
push_back()//尾插
pop_back()//尾删
begin()/end()//迭代器
黑科技
支持两个vector比较按字典序(444>33333)
#include<bits/stdc++.h>
using namespace std;
int main(){
vector<int> a (3,4);
vector<int> b (4,3);
if(a>b)cout<<1;
else cout<<0;
//输出为1
return 0;
}
pair
存储二元组
pair的定义
pair<int ,int>p;//前后两个数据类型可任意
pair的访问
p.frist;
p.second;
pair的初始化
p=mack_pair(10,111) ;
p={20,123};//c++11特有
pair存储3个元素
pair<int, pair<int ,int>>p;
主要应用
按照某一特质排序,具体用法,将排序的特质放fist
pair也可用于比较,按字典序
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main(){
vector<pair<int, string> > vec;
vec.push_back(make_pair(11111,"li" ));
vec.push_back(make_pair(222, "liu"));
vec.push_back(make_pair(33, "wang"));
vec.push_back(make_pair(5, "zhao"));
sort(vec.begin(), vec.end());
for(auto num: vec){
cout<<num.second << endl;
//输出为zhao wang liu li(字典序)
}
}
string
#include<bits/stdc++.h>
using namespace std;
int main(){
//string的一些操作
string s="abc";
s+="rrr";
s+='a';
//cout<<"abcrrra"
cout<<s.substr(1,3);
//substr(n,m)n是起始下标(从0开始),m是个数 ,当m大于剩余总长
//输出到结束为止,也可以不输入m表示从n开始到最后
//cout<<"bcr"
printf("%s\n",s.c_str()) ;
//输出整个s
return 0;
}
queue
队列:先进先出,一头进,另一头出
支持函数
size()
empty()
push() 向队尾插入一个元素
front() 返回队头元素
back() 返回队尾元素
pop() 弹出队头元素
清空队列
#include<bits/stdc++.h>
using namespace std;
int main(){
queue<int>q;
q=queue<int>();//清空队列
return 0;
}
priority_queue
优先队列(堆)默认是大根堆:最大堆,最大二叉树数,根是最大值
支持函数
size()
empty()
push() 插入一个元素
top() 返回堆顶元素
pop() 弹出堆顶元素
定义成小根堆的方式:priority_queue<int, vector<int>, greater<int>> q;
定义成小根堆的方式
定义成小根堆的方式:priority_queue<int, vector<int>, greater<int>> q;
或者
priority_queue<int>heap;
heap.push(-x) ;
//插入时插相反值
stack
支持函数
size()
empty()
push() 向栈顶插入一个元素
top() 返回栈顶元素
pop() 弹出栈顶元素
deque
加强版的vector,双端队列,功能牛波一,但慢的令人发指,用的不多
size()
empty()
clear()
front()/back()
push_front()/pop_front()//队首插,队首删
begin()/end()
front()/back()//返回vector的第一/最后一个的数
push_back()//尾插
pop_back()//尾删
[]//随机选取
set, map, multiset, multimap, 基于平衡二叉树(红黑树),动态维护有序序列
size()
empty()
clear()
begin()/end()
++, -- 返回前驱和后继,时间复杂度 O(logn)
set
set<int >s;//不能有重复元素
multiset<int>ms; //可以有
支持函数
insert() 插入一个数
find() 查找一个数
count() 返回某一个数的个数
erase()
(1) 输入是一个数x,删除所有x O(k + logn)
(2) 输入一个迭代器,删除这个迭代器
lower_bound()/upper_bound()
lower_bound(x) 返回大于等于x的最小的数的迭代器
upper_bound(x) 返回大于x的最小的数的迭代器
map
支持函数
insert() 插入的数是一个pair
erase() 输入的参数是pair或者迭代器
find()
[] 注意multimap不支持此操作。 时间复杂度是 O(logn)
lower_bound()/upper_bound()
应用的优势
#include<bits/stdc++.h>
using namespace std;
int main(){
map<string,int>a;
a["zy"]=1;
cout<<a["zy"];//当成数组来用
//cout<<1;
return 0;
}
unordered_set, unordered_map, unordered_multiset, unordered_multimap, 哈希表
和上面类似,增删改查的时间复杂度是 O(1)//优点
不支持 lower_bound()/upper_bound(), 迭代器的++,--//缺点,无序
其他与之对应的基本一致
bitset
主要优点可以节省八倍空间
bitset, 圧位
bitset<10000> s;
~, &, |, ^
>>, <<
==, !=//支持各种(位运算)运算
[]
count() 返回有多少个1
any() 判断是否至少有一个1
none() 判断是否全为0
set() 把所有位置成1
set(k, v) 将第k位变成v
reset() 把所有位变成0
flip() 等价于~//取反
flip(k) 把第k位取反
精简的总结
vector, 变长数组,倍增的思想
size() 返回元素个数
empty() 返回是否为空
clear() 清空
front()/back()
push_back()/pop_back()
begin()/end()
[]
支持比较运算,按字典序
pair<int, int>
first, 第一个元素
second, 第二个元素
支持比较运算,以first为第一关键字,以second为第二关键字(字典序)
string,字符串
size()/length() 返回字符串长度
empty()
clear()
substr(起始下标,(子串长度)) 返回子串
c_str() 返回字符串所在字符数组的起始地址
queue, 队列
size()
empty()
push() 向队尾插入一个元素
front() 返回队头元素
back() 返回队尾元素
pop() 弹出队头元素
priority_queue, 优先队列,默认是大根堆
size()
empty()
push() 插入一个元素
top() 返回堆顶元素
pop() 弹出堆顶元素
定义成小根堆的方式:priority_queue<int, vector<int>, greater<int>> q;
stack, 栈
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()
++, -- 返回前驱和后继,时间复杂度 O(logn)
set/multiset
insert() 插入一个数
find() 查找一个数
count() 返回某一个数的个数
erase()
(1) 输入是一个数x,删除所有x O(k + logn)
(2) 输入一个迭代器,删除这个迭代器
lower_bound()/upper_bound()
lower_bound(x) 返回大于等于x的最小的数的迭代器
upper_bound(x) 返回大于x的最小的数的迭代器
map/multimap
insert() 插入的数是一个pair
erase() 输入的参数是pair或者迭代器
find()
[] 注意multimap不支持此操作。 时间复杂度是 O(logn)
lower_bound()/upper_bound()
unordered_set, unordered_map, unordered_multiset, unordered_multimap, 哈希表
和上面类似,增删改查的时间复杂度是 O(1)
不支持 lower_bound()/upper_bound(), 迭代器的++,--
bitset, 圧位
bitset<10000> s;
~, &, |, ^
>>, <<
==, !=
[]
count() 返回有多少个1
any() 判断是否至少有一个1
none() 判断是否全为0
set() 把所有位置成1
set(k, v) 将第k位变成v
reset() 把所有位变成0
flip() 等价于~
flip(k) 把第k位取反