C++的常见STL总结

C++的STL模板

//常见的4个库,需要记住了
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
int main(){
    
    

}

1.vector讲解

//注意下面vector里面不一定就是int,也可以是别的类型
//需要使用头文件:#include<vector>
//1.定义一个长度为10且每一个数为3的vector
vector<int> vec(10,3);
//2.定义一个长度为10的vector,那么初始化为0
vector<int> a(10);
//3.定义vector数组
vector<int> b[3];
//4.常见函数
a.empty();//判断a是否为空
a.size();//返回a的大小,这两个函数是今天讲的所有函数都有的,且时间复杂度为O(1)
a.clear();//清空容器
a.front();//返回第一个数
a.back();//返回最后一个数
a.push_back(1);//再最后假如一个数
a.pop_back();//在最后删除一个数
a.begin();//代表指向第一个数
a.end();//代表指向最后一个数的后面一个数
a.erase(a.begin());//删除第一个元素(下标为0的元素)
//5.vector的倍增的思想
/*
系统分配空间所需的时间与分配空间大小无关,而是与分配的次数相关,比如一次
分配1000个空间和1000次每次分配一个空间,后者的时间开销要大得多,那么倍增
的思想就是为了减少分配的次数,比如最开始分配了32个空间,当用完后,就分配
32*2个空间,并将之前的32个空间的内容拷贝过来,之后再超出空间限制在按照这
个方式来倍增即可
*/
//6.遍历Vector
for(int i = 0;i<a.size();i++) cout<<a[i]<<" ";
for(vector<int>::iterator i=a.begin();i!=a.end();i++) cout<<*i<<" ";
for(auto i=a.begin();i!=a.end();i++) cout<<*i<<" ";
for(auto x:a) cout<<x<<" ";
//7.Vector支持比较
vector<int> m(2,1);//[1,1]
vector<int> n(1,2);//[2]
if(m<n) cout<<"m<n";//比较m与n的字典序

2.pair讲解

//注意下面pair里面不一定就是int与string,也可以是别的类型
//1.定义pair的三种方式
 pair<int,string> p(1,"a");
 pair<int,string> p2 = {
    
    2,"不"};
 pair<int,string> p3 = make_pair(3,"可以");
//2.获取pair的两个值
 cout<<p.first<<" "<<p.second<<endl;
 cout<<p2.first<<" "<<p2.second<<endl;
 cout<<p3.first<<" "<<p3.second<<endl;
//3.pair的比较,按照字典序来比较
 if(p<p2) cout<<"p<p2";
//使用pair来存储三个元素
pair<int,pair<int,string>> p4;

3.string讲解

//常见的函数
string s = "abc";
s.empty();//判断是否是空串,这里是指串的长度为0
s.size();//获取串长,也可以使用length()
string a = "qq";
s+=a;//此时s="abcqq"
s.substr(1,2);//表示从下标为1的字符开始截取长度为2的串,结果为bc
s.substr(1)//表示把从下标1开始往后的字符全部截取,结果为bcq
s.c_str();//返回s对应的字符数组首地址

4.queue讲解

//需要使用头文件:#include<queue>
//1.常见函数讲解,无clear()函数
    queue<int> q;
    q.push(1);
    q.push(2);//从队尾依次插入1,2
    q.front();//获取队头元素为1
    q.back();//获取队尾元素为2
    q.size();//获取队列的大小为2
    q.empty();//判断队列是否为空
    q.pop();//弹出队头元素1

5.priority_queue讲解

//需要使用头文件:#include<queue>
    priority_queue<int> q;//默认是大根堆
    //1.优先对列的常见函数,无clear()函数
    q.empty();
    q.size();
    q.push(1);
    q.push(3);
    q.push(4);//分别插入元素1,3,4
    q.pop();//弹出堆顶元素4
    q.top();//获取堆顶元素3
    //2.如何定义小根堆
    //可以这么做:比如本来要插入x,但是我插入-x,不过我取出来是乘以-1就还原了
    //当然也可以直接定义小根堆
    priority_queue<int,vector<int>,greater<int>> q2;//这是小根堆

6.stack讲解

//需要使用头文件:#include<stack>
    //1.stack常用的函数,无clear()函数
    stack<int> s;
    s.push(1);
    s.push(2);
    s.top();//获取栈顶元素2
    s.pop();//弹出栈顶元素2
    s.size();//获取栈的大小
    s.empty();//判断栈是否为空

7.deque讲解

//需要使用头文件:#include<deque>
   deque<int> deq;
   //1.常见函数
   deq.push_back(1);
   deq.push_back(2);//依次在队尾插入1,2
   int a = deq[0];//获取双向队列索引0处元素1
   deq.pop_back();
   deq.pop_back();//执行两次弹出队尾元素

   deq.push_front(1);
   deq.push_front(2);//依次在队头插入1,2
   deq.pop_front();
   deq.pop_front();//两次执行在队头弹出元素

   deq.size();//获取双向队列的大小
   deq.empty();//判断双向队列是否为空
   deq.clear();//清空双向队列

8.set与multiset讲解

//需要使用头文件:#include<set>,下面的方法multiset也可以使用
//只不过后者可以允许重复元素
   //1.常见函数
   set<int> s;
   s.size();//获取s的大小
   s.empty();//判断s是否为空
   s.clear();//清空s
   s.insert(1);
   s.insert(2);
   s.insert(3);
   s.insert(1);//插入1两次但是最后只有一个1,因为不允许重复
   s.find(1);//查找1并返回指向1迭代器,如果没有1则返回end迭代器
   s.count(1);//获取1的个数,这里是1
   s.lower_bound(2);//返回大于等于2的最小数的迭代器
   s.upper_bound(2);//返回大于2的最小数的迭代器
   //最后是erase函数,详情请参见下面链接
   /*
   		1.参数为x,则删除所有的x O(k+logn),k是x的个数
   		2.参数是迭代器,则删除迭代器里指向的元素
   */

C++ set erase() 使用方法及示例

9.map与multimap讲解

//需要使用头文件:#include<map>,下面的方法multimap也可以使用
//1.直接赋值
   map<string,string> mm;
   mm["a"] = "abc";//复杂度为logn
   //2.常见函数
   map<int,string> m;
   m.insert({
    
    1,"a"});//插入的是一个pair
   map<int,string>::iterator i = m.find(1);//返回的是迭代器
   cout<<i->first<<" "<<i->second<<endl;//输出1 a
   m.erase(1);//参数可以是key或者迭代器
   i = m.find(1);
   cout<<i->first<<" "<<i->second<<endl;//输出0

   m.insert({
    
    1,"A"});
   m.insert({
    
    2,"B"});
   m.insert({
    
    5,"C"});
   m.upper_bound(2);
   m.lower_bound(3);//比较的是key,返回值为迭代器

  //遍历Map
  map<int,int> Map;
  Map[1] = 1;
  Map[2] = 2;
  for(auto i = Map.begin();i!=Map.end();i++){
    
    
      cout<<(*i).first<<" ";
  }

最后是:

unordered_map:使用 #include<unordered_map>,下同
unordered_set
unordered_multimap
unordered_multiset

这四个模板也可以使用上面的方法,来增删改查,且复杂度O(1),但是不支持lower_bound()与upper_bound()方法,前面讲的set/multiset与map/multimap支持迭代器的++与–,但是这四个不支持++与–

10.bitset讲解

//需要使用头文件:#include<bitset>
//1.常见函数
bitset<10> s;//定义一个长度为10的bitset,一般bitset的作用在于节省空间
//bitset支持所有的逻辑运算:&,^,~,|
s.set();//将s全部置为0
s.set(1,0);//将第1位设置为0,注意第二个置为0置为0,非0则置为1
s.reset();//将s全部置为0
s.flip();//将s全部取反
//2.直接获取
cout<<s[0];

猜你喜欢

转载自blog.csdn.net/qq_44932835/article/details/109425297