第三章 数据结构(三) (STL)

 //所有容器都有的
     size();
     empty();
     clear();//队列没有
 

一、vector 变长数组

1、vector要尽量减少申请空间的次数,,不够的时候就直接变成两倍。

 //初始化
vector<int> a;//10个3
 vector<int>a[10];//10个vector
//遍历
//for (auto x:a)cout<<x<<endl;
//添加数据
 for(int i=0;i<10;i++)
    a.push_back(i);
//迭代器
for(vector<int>::iterator i=a.begin();i!=a.end();i++)
    cout<<*i<<endl;
for(auto x:a)cout<<x<<endl;
//vector数组的第一个数和最后一个数
      cout<<a.front()<<endl;
      cout<<a.back()<<endl;
//支持比较运算
      vector<int> a(4,3);
      vector<int>b(3,4);
      if(a<b)puts("a<b");

二、pair 二元组

支持比较运算:以first为第一元素,second为第二元素

  //定义与初始化  
  pair<int,string>p;
  p=make_pair(10,"xxx");
  p={20,"aaa"};

三、string 字符串

string s="1234";
cout<<s.substr(1,2)<<endl;//返回从下标1开始的长度为2的子串
cout<<s.substr(1)<<endl;  //返回从下标1开始的整个子串
printf("%s\n",s);//不能正常输出
printf("%s\n",s.c_str());//可以正常输出
s.clear();

四、queue 队列

           

 queue<int>q;
 //队列没有clear清空方法
 q=queue<int>();
for(int i=0;i<10;i++)
    {
        q.push(i);//添加队尾
    }
    q.pop();//删除队头
    cout<<q.front()<<endl;//队头
    cout<<q.back()<<endl;//队尾

        priority_queue  优先队列

    //默认是大顶堆
    priority_queue<int>heap;
    //同样没有clear函数
    for(int i=0;i<10;i++)
    {
        //q.push(i);
        //要想按照小顶堆来排序可以加负号
        heap.push(-1*i);
    }
    heap.pop();
    cout<<heap.top()<<endl;//优先队列只能返回队头元素,而且不用front()
 //优先队列小根堆的定义方法
    priority_queue<int,vector<int>,greater<int>>heap;
    for(int i=10;i>=1;i--)heap.push(i);
    cout<<heap.top()<<endl;

五、stack 栈

         

 stack<int> stk;
   for(int i=0;i<10;i++)stk.push(i);
   stk.pop();
   cout<<stk.top();
   cout<<"一共有"<<stk.size()<<"个元素"<<endl;

五、deque 双端队列

         支持队头队尾双端弹入弹出

deque<int>deq;
   //队尾插入元素
   deq.push_back(1);
   cout<<deq.back()<<endl;
   //队首插入元素
   deq.push_front(2);
   cout<<deq.front()<<endl;
   //迭代器
   for(deque<int>::iterator i=deq.begin();i!=deq.end();i++)
    cout<<*i<<" ";
   //队首弹出
   deq.pop_front();
   //队尾弹出
   deq.pop_back();
   cout<<deq.size()<<endl;

六、set、mutiset、(动态维护序列)

   set<int>se;
   multiset<int>mse;
   for(int i=0;i<10;i++)se.insert(i),mse.insert(i-i);
   //注意find的用法
   if(se.find(1)!=se.end())cout<<"找到了"<<endl;
   //multiset中find用法
   if(mse.find(0)!=mse.end())cout<<"找到了"<<endl;
   //count erase
   cout<<se.count(0)<<endl;
   mse.erase(0);
   cout<<mse.count(0)<<endl;
   set<int>se;
   multiset<int>mse;
   for(int i=0;i<10;i++)se.insert(i),mse.insert(i-i);
   //lower_bound()返回大于等于x的最小的数
   cout<<*se.lower_bound(1)<<endl;
   cout<<*mse.lower_bound(0)<<endl;
    //lower_bound()返回大于x的最小的数
    //要先判断是否存在
   if(se.upper_bound(9)==se.end())cout<<"没有了"<<endl;
   else cout<<*se.upper_bound(9)<<endl;
    if(mse.upper_bound(0)==mse.end())cout<<"没有了"<<endl;
    else  cout<<*mse.upper_bound(0)<<endl;

七、map、multimap

 //初始化
   map<string,int> a;
   //插入
   a["zzz"]=1;
   a.insert(make_pair("aaa",2));
   //可以当数组用 O(log(n))
   cout<<a["zzz"];
   //lower_bound和upper_bound
   cout<<a.lower_bound("zzz")->second<<endl;
   //upper_bound
   cout<<a.lower_bound("aaa")->second<<endl;


八、undered_set、unordered_map、unordered_multiset、unordered_multimap 

增删改查的时间复杂度为O(1),不支持lower_bound和upper_bound操作(内部是没有序的),迭代器的加加减减也是不支持的

九、bitset

用一位代替一字节存储,省内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值