C++ STL容器总结

目录

vector:变长数组

pair:存储二元组

bool:布尔变量,存放true或false

string:字符串

queue :循环队列:先进先出

priority_queue:优先队列:大根堆或小根堆

stack:栈 :先进后出

 deque:双端队列:两端插入或删除

set:动态维护有序序列,不能有重复元素

multiset:动态维护有序序列,可以有重复元素

 map:动态维护有序序列,键值对key-value的映射

 multimap:动态维护有序序列,可以有重复元素

unordered_set

unordered_map

unordered_multiset

unordered_multimap

bitset:存放二进制的串,压位运算


vector:变长数组

  • 头文件:#include<vector>
  • 支持比较运算,按字典序
  • 定义与赋值
    vector<int> a;
    vector<int> a(10); 定义一个长度为10的vector数组
    vector<int> a(10,3); 定义一个长度为10,所有元素都初始化为3的vector数组
    vector<int> a[ ]={1,2,3,4,5};定义一个vector数组
    vector<Rec> a; 可以定义一个以结构体为元素的vector数组
  • 常用用法
    a.size(); 返回vector数组的长度
    a.empty(); 返回vector数组是否为空,为空则返回true
    a.clear(); 清空vector数组
    
    a.begin(); 返回开头的迭代器
    a.end();   返回最后一个数的下一个数的迭代器
    
    a.front(); 返回开头的值
    a.back();  返回结尾的值
    
    (迭代器相当于指针,有如下关系)
    a[0]=*a.begin()=a.front();
    a[a.size()-1]=*a.end()=a.back();
    
    a.push_back(x); 在数组的结尾添加一个x元素
    a.pop_back();   把数组的结尾元素删掉
    
  • 遍历与输出

    数组下标遍历方式
    for(int i=0;i<a.size();i++) cout<<a[i];
    
    迭代器遍历方式
    for(auto i=a.begin();i!=a.end();i++) cout<<*i;
    
    范围遍历方式
    for(auto x:a) cout<<x;
    

pair:存储二元组

  • 支持比较运算,按字典序
  • 定义与赋值
    pair<int,int> a={3,3}; 定义一个(3,3)的pair变量
    pair<string,int> a; 定义一个元素类型不一样的pair变量
    
    a=make_pair("hxq",3);
    a=("hxq",3);  c++11里支持的写法
  • 常用用法
    a.first; 返回第一个值
    a.second; 返回第二个值
    
    pair<int ,pair<int,int>> a可以实现存储三个数值
    
    pair<int ,int> a的常用场景:第一个元素用来排序,第二个元素不变

bool:布尔变量,存放true或false

string:字符串

  • 头文件:#include<string>
  • 定义与赋值
    string s; 定义一个默认的空字符串
    string s2=s1; 定义一个s2等于s1字符串
    string s="hello"; 定义一个字符串并初始化
    string s(10,'c'); 定义一个长度为10的字符串并把所有元素初始化为'c'
    
    cin>>s; 读入一个string字符串,不能读入空格
    getline(cin,s); 读入一个string字符串,可以读入空格
    getline(cin,s,' '); 读入一个string字符串,传入的第三个参数意思是遇到‘ ’停止
    
    (注意string不能用scanf输入)
  • 常用用法
    s.size(); 返回string的长度
    s.empty(); 返回string是否为空
    
    s.substr(i,len); 提取s中从i开始,长度为len的一段子串
    s.substr(i);     提取s中从i开始,直到结尾的一段子串
    
    s.back(); 返回字符串的最后一个元素
    s.pop_back(); 删除字符串的最后一个元素
    
    string的相加:保证加法两边至少要有一个是string变量
    string s3=s1+s2; s3为s1拼接上s2
    string s3=s1+"is best"+'c'; string可以与字符串以及单个字符相加,这些字符串和字符会转为string
    错误:string s3='c'+"is best"+s1; 加法运算从左至右,字符串不能与单个字符相加
    
    
    
  • 遍历与输出
    输出方式
    cout<<s;
    printf("%s",s.c_str());
    puts(s); 会自动补上换行符
    
    
    遍历方式
    for(int i=0;i<s.size();i++) cout<<s[i];
    
    for(auto x:s) cout<<x;
    (在范围遍历里面改变x的值是不会改变s里的值的,除非一开始传址(auto &x:s))

queue :循环队列:先进先出

  • 头文件:#include<queue>
  • 定义与赋值
    queue<int> q; 定义一个元素为int类型的队列
    queue<Rec> q; 定义一个元素为结构体类型的队列
    
  • 常用用法
    q.push(x); 队头插入一个元素
    q.pop();   弹出队尾
    q.front(); 返回队头的值
    q.back();  返回队尾

priority_queue:优先队列:大根堆或小根堆

  • 头文件:#include<queue>
  • 定义与赋值
    priority_queue<int> q; 定义一个大根堆:堆顶元素为最大值
    priority_queue<int,vector<int>,greater<int> q; 定义一个小根堆,堆顶元素为最小值
    priority_queue<pair<int,int>> q; 定义一个元素类型为pair的大根堆
  • 常用用法
    q.push(x); 把元素插入堆
    q.pop();  删除堆顶元素
    q.top();  返回堆顶元素
    

stack:栈 :先进后出

  • 头文件:#include<stack>
  • 定义与赋值(同上)
  • 常用用法
    stk.push(x); 向栈顶插入一个元素x
    stk.pop();   弹出栈顶元素

 deque:双端队列:两端插入或删除

  • 头文件:#include<deque>
  • 定义与赋值(同上)
  • 常用用法
    q.begin(),q.end(); 返回头尾的迭代器
    q.front(),q.back(); 返回队头队尾的元素
    
    q.push_back(x); 从队尾入队
    q.push_front(x); 从队头入队
    
    q.pop_back(); 从队尾出队
    q.pop_front(); 从队头出队
    
    q.clear(); 清空队列

set:动态维护有序序列,不能有重复元素

multiset:动态维护有序序列,可以有重复元素

  • 头文件:#include<set>
  • 定义与赋值(同上)
  • 常用用法
    q.size(),q.empty(),q.clear();
    q.begin(),q.end();
    
    q.insert(x); 把元素x插入到集合q中,时间复杂度O(logn)
    
    q.find(x); 返回x的迭代器,如果没有则返回q.end(),时间复杂度为O(logn)
    
    q.count(x); 返回x出现的次数
    
    q.erase(x);
       1.输入的是一个数x,则代表删除所有的x,时间复杂度为O(k+logn)
       2.输入的是一个迭代器,则删除这个迭代器,时间复杂度为O(logn)
    
    q.lower_bound(x); 查找大于等于x的元素中最小的那个,并返回其迭代器
    q.upper_bound(x); 查找严格大于x的元素中最小的那个,并返回其迭代器
    
    

 map:动态维护有序序列,键值对key-value的映射

 multimap:动态维护有序序列,可以有重复元素

  • 头文件:#include<map>
  • 定义与赋值
    map<string,int> q;
    
    map最吸引人的地方:[]操作符,即map可以像数组一样操作,时间复杂度O(logn)
    q["hxq"]=1;   即把1映射给hxq
    cout<<q["hxq"];   会输出1
    
  • 常用用法
    q.size(),q.empty(),q.clear();
    q.begin(),q.end();
    
    q.insert(pair<key,value>); 把一个pair元素插入到集合q中,时间复杂度O(logn)
    
    q.find(x); 返回key值为x的二元组的迭代器,如果没有则返回q.end(),时间复杂度为O(logn)
    
    q.erase(pair<key,value>);
       1.输入的是一个数x,则代表删除所有的x,时间复杂度为O(k+logn)
       2.输入的是一个迭代器,则删除这个迭代器,时间复杂度为O(logn)
    
    q.lower_bound(pair<key,value>); 查找大于等于x的元素中最小的那个,并返回其迭代器
    q.upper_bound(pair<key,value>); 查找严格大于x的元素中最小的那个,并返回其迭代器

unordered_set

unordered_map

unordered_multiset

unordered_multimap

  • 定义用法同上
  • 优势:增删改查的时间复杂度是O(1)
  • 劣势:不支持lower_bound() / upper_bound(),迭代器的加加减减

bitset:存放二进制的串,压位运算

  • 头文件:#include<bitset>
  • 支持所有位运算以及==,!=等运算
  • 定义与赋值
    bitset<1000> a; 长度为1000的bitset集合
    
    支持[]操作符
    a[0]=1;
    a[1]=0;
  • 常用用法
    应用场景:要存储很大的bool数组,可以使用bitset来节省空间
    
    a.count(); 返回有多少个1
    
    a.any(); 判断是否至少有一个1
    a.none(); 判断是否全为0
    
    set(); 把所有位置置为1
    set(k,v); 把k位置置为v
    
    reset(); 把所有位置置为0
    
    flip(); 把所有位置取反,等价于~
    flip(k); 把k位置取反

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值