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()
queueq;
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
不常用 要添加头文件因为你完全可以用vector来模拟
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;
 }
  1. 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

posted @ 2021-03-14 10:12  liv_vil  阅读(61)  评论(0)    收藏  举报