STL by pcccc

1 篇文章 0 订阅

前言
所有常用操作都在代码里
STL可能会很慢,时间允许的话可替代操作还是手写好
建议对每一种都盲敲2~3遍代码,不要眼高手低



Vector

#include<iostream>
#include<cstdio>
#include<vector>//!!!头文件
using namespace std;
vector<int> a[100];
int main()
{
    for(int i=1;i<=200;i++) a[1].push_back(i);//插入
    a[1].pop_back();//弹出
    cout<<a[1].size()<<endl;//大小
    for(int i=0;i<199;i++)
    cout<<a[1][i]<<endl;

}

Map

Map是c++的一个标准容器,按字面意思就是地图的意思
即给你一个元素,根据“地图”找到这个元素对应的元素

 /*头文件<map>*/
#include <map>
#include <iostream>
using namespace std;
int main()
{   
    map<string,int> a; 
    cout<<"插入:"<<endl;
    a["April"]=112;//插入
    cout<<a["April"]<<endl;
    cout<<endl;



    cout<<"查询:"<<endl;
    map<string,int>::iterator pc;//查询一个元素是否在map里 
    pc=a.find("April");
    if(pc==a.end()) cout<<"Not Find"<<endl;//如果找不到会自动返回“指向map尾部的迭代器”
    else cout<<pc->second<<endl;//输出"April"对应的键值
    cout<<endl;



    cout<<"遍历"<<endl; 
    a["June"]=1;//遍历 
    a["July"]=2;
    map<string,int>::iterator i;
    for(i=a.begin(); i!=a.end(); i++)//不能等于a.end() 
    {
        cout<<i->second<<endl;
    }
    cout<<endl;



    cout<<"判断map是否是空集"<<endl; 
    cout<<a.empty()<<endl;//判断map是否是空集
    cout<<endl;


    cout<<"交换两个map的元素 "<<endl; 
    map<int ,int> b;//交换两个map的元素 
    map<int ,int> c;
    c[1]=1;
    c[2]=2;
    b[1]=1000;
    swap(b,c);
    map<int,int> ::iterator j;
    for(j=b.begin();j!=b.end();j++)
    {
        cout<<j->second<<endl;
    }
    for(j=c.begin();j!=c.end();j++)
    {
        cout<<j->second<<endl;
    }


}
  • map中 swap的用法:
    Map中的swap不是一个容器中的元素交换,而是两个容器交换;
  • Map中的元素是自动按key升序排序
 #include <map>
  #include <iostream>
  using namespace std;
 int main( )
 {
   map <int, int> m1;
   map <int, int>::iterator m1_Iter;
   m1[1]=20;
   m1[4]=40;
   m1[3]=60;
   m1[2]=50;
   m1[6]=40;
   m1[7]=30;
   cout << "The original map m1 is:"<<endl;
   for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )
      cout <<  m1_Iter->first<<" "<<m1_Iter->second<<endl;
}
/*
The original map m1 is:
  1 20
  2 50
  3 60
  4 40
  6 40
  7 30
*/
  • map的基本操作函数:
    begin()          返回指向map头部的迭代器
    clear()         删除所有元素
    count()          返回指定元素出现的次数
    empty()          如果map为空则返回true
    end()            返回指向map末尾的迭代器
    *equal_range()    返回特殊条目的迭代器对
    erase()          删除一个元素
    find()           查找一个元素
    get_allocator()  返回map的配置器
    insert()         插入元素
    key_comp()       返回比较元素key的函数
    lower_bound()    返回键值>=给定元素的第一个位置
    max_size()       返回可以容纳的最大元素个数
    rbegin()         返回一个指向map尾部的逆向迭代器
    rend()           返回一个指向map头部的逆向迭代器
    size()           返回map中元素的个数
    swap()            交换两个map
    upper_bound()     返回键值>给定元素的第一个位置
    value_comp()      返回比较元素value的函数

Set

  • set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。应该注意的是set中数元素的值不能直接被改变。
  • set中常用的方法
begin()      返回set容器的第一个元素
end()      返回set容器的最后一个元素
clear()      删除set容器中的所有的元素
empty()     判断set容器是否为空
size()      返回当前set容器中的元素个数
count()       用来查找set中某个某个键值出现的次数。这个函数在set并不是很实用,因为一个键值在set只可能出现01次,这样就变成了判断某一键值是否在set出现过了。
find()  ,返回给定值值得定位器,如果没找到则返回end()。
#include <iostream>
#include <set>

using namespace std;

int main()
{
    set<int> s;
    s.insert(1);
    s.insert(2);
    s.insert(3);
    s.insert(1);
    cout<<"set 的 size 值为 :"<<s.size()<<endl;
    cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;
    cout<<"set 中的第一个元素是 :"<<*s.begin()<<endl;
    cout<<"set 中的最后一个元素是:"<<*s.end()<<endl;
    s.clear();
    if(s.empty())
    {
        cout<<"set 为空 !!!"<<endl;
    }
    cout<<"set 的 size 值为 :"<<s.size()<<endl;
    cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;
    return 0;
}

这里写图片描述

  • lower_bound(key_value) ,返回第一个大于等于key_value的定位器
  • upper_bound(key_value),返回最后一个大于等于key_value的定位器
#include <iostream>
#include <set>

using namespace std;

int main()
{
    set<int> s;
    s.insert(1);
    s.insert(3);
    s.insert(4);
    cout<<*s.lower_bound(2)<<endl;
    cout<<*s.lower_bound(3)<<endl;
    cout<<*s.upper_bound(3)<<endl;
    return 0;
}

这里写图片描述

Queue

普通队列大家都会写吧

我们来看看如何用queue来实现堆的功能

//小根堆 
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
priority_queue<int,vector<int>,greater<int> >q;//默认是大根堆,小根堆需要自己加greater<int>
int main()
{
    q.push(1);
    q.push(2);
    q.push(3);
    while(q.size())
    {
        cout<<q.top()<<endl;
        q.pop();
    }
}
//大根堆 
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
priority_queue<int>q;
int main()
{
    q.push(1);
    q.push(2);
    q.push(3);
    while(q.size())
    {
        cout<<q.top()<<endl;
        q.pop();
    }
}

Bitset

bitset可以看作bool数组,但优化了空间复杂度和时间复杂度,并且可以像整型一样按位与或。

#include<iostream>
#include<cstdio>
#include<bitset>
using namespace std;
bitset<10> a;//<>中间是长度!!!
bitset<10> b;
int main()
{
    a.set();//全部置为1
    cout<<a<<endl;
    a.reset();//全部置为0
    a[1]=1;//可以直接把它当作一个数来进行二进制操作
    a=a|b;
    cout<<a.count()<<endl; //输出bitset里有多少个1
    cout<<a<<endl;
    a.flip();//将bitset里的元素翻转一下
    cout<<a;
}
  • <>中间是长度!!!
  • bitset空间占用十分小,运行速度也很快!!奇技淫巧
  • 常用的成员函数:
b.any() b中是否存在置为1的二进制位?
b.none() b存在置为1的二进制位吗?
b.count() b中置为1的二进制位的个数
b.size() b中二进制位数的个数
b[pos] 访问b中在pos处二进制位
b.test(pos) b中在pos处的二进制位置为1么?
b.set() 把b中所有二进制位都置为1
b.set(pos) 把b中在pos处的二进制位置为1
b.reset( ) 把b中所有二进制位都置为0
b.reset( pos ) 把b中在pos处的二进制位置置为0
b.flip( ) 把b中所有二进制位逐位取反
b.flip( pos ) 把b中在pos处的二进制位取反
b.to_ulong( ) 把b中同样的二进制位返回一个unsigned
b._Find_next(pos) 返回bitset在位置pos之后第一个1的位置


lower_bound&upper_bound

  • 函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于**val的第一个元素位置。如果所有元素都小于val,则返回last的位置
    用法: int t=lower_bound(a+l,a+r,m)-a

  • 函数upper_bound()在first和last中的前闭后开区间进行二分查找,返回大于val的第一个元素位置。如果所有元素都小于val,则返回last的位置
    复杂度O(logn)
    这里写图片描述


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值