【STL基本用法】

简介: vector:动态数组(可变长数组,倍增的思想) size() 返回元素的个数(所有的SLT容器都有,O(1)) empty() 返回是否为空 (所有的SLT容器都有) clear() 清空 front()/back() 返回vector第一个/最后一个数 push_back()/pop_back() 在vector最后插入一个数/把最后一个元素删除 begin()/end() 迭代器,begin

vector

vector:动态数组(可变长数组,倍增的思想)
    size()                      返回元素的个数(所有的SLT容器都有,O(1))
    empty()                     返回是否为空  (所有的SLT容器都有)
    clear()                     清空
    front()/back()              返回vector第一个/最后一个数
    push_back()/pop_back()      在vector最后插入一个数/把最后一个元素删除
    begin()/end()               迭代器,begin()是vector第0个数,end()是vector最后一个数的后一位数
    []                          []通过下标,可以取值、修改,但不能添加
    支持比较运算,按字典序(随机寻值,与数组一样)
    
pair<int, string>                存储二元组(俩个类型任意)         
    first,第一个元素
    second第二个元素
    支持比较运算,以first为第一关键字,以second为第二关键字(字典序)
pair<int, pair<char, string>>    存储三元组(三个类型任意)     

倍增思想:

  • 系统为某一线程(程序)分配空间时,所需的时间与空间大小无关,与申请次数有关
  • 优化:尽量减少空间申请次数,可以浪费空间。
  • 当空间大小不足时,vector会重新在申请一个空间,该空间是之前空间的2倍,并把元素,拷贝到新空间中去。
# -----------vector初始化----------------------------------------
vector<int> a; 
vector<int> a(10);               定义长度为10的vector,且默认值都为0
vector<int> a(10, 3);            定义长度为10的vector,且都初始化为3   
vector<int> a[10];               定义vector数组,定义了10个vector


# ---------遍历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 << " ";

//当类型比较长,可以写成auto,可以自动帮我们推断出类型
for (auto i = a.begin(); i != a.end(); i ++ )  
for (auto x : a)   cout << x << " ";

#----------支持比较运算--------------------------------
vector<int> a(4,3), b(3, 4);
if (a < b) puts("a < b"); 
输出结构为a < b

#---------pair初始化方式-----------------------------
pair<int, string> p;
p = make_pair(10, "xdm");
p = {20, "xdm"};

string

string 字符串, 
    substr(a, b)    返回某一个子串 ,下标从a开始,返回子串的长度是b。当b的值非常大,超出了字符长度,此时会输出到最后一个字母为止。
    c_str()         返回字符串数组的起始地址
    size()/length() 返回字符串长度
    empty()
    clear()
string a = 'xdm";
a += "wan";
a += 'c';
cout << a;              //xdmwanc
cout << a.substr(1,3)   //dmw
cout << a.substr(1, 10) //dmwanc
cout << a.substr(1);    //dmwanc
printf("%s\n", a.c_str);//xdmwanc 

queue

queue, 队列(先进先出)
    size()
    empty()
    push()                       向队尾插入一个元素
    pop()                        弹出队头元素
    front()                      返回队头元素
    back()                       返回队尾元素
queue<int> q;    
q = queue<int> ();   //queue没有clear操作,可以用这种方法进行清空

priority_queue

priority_queue,优先队列,用堆实现的,默认大根堆
    push()                   插入一个元素
    top()                    返回堆顶元素
    pop()                    弹出堆顶元素
priority_queue<int> heap;        默认大根堆

#定义成小根堆有俩种方法
heap.push(-x);                   -x从大到小,也就是x从小到大    
priority_queue<int, vector<int>, greater<int>> heap;
   

stack

stack, 栈
    size()
    empty()
    push()                       向栈顶插入一个元素
    top()                        返回栈顶元素
    pop()                        弹出栈顶元素

deque

deque,双端对列
    size()
    empty()
    clear()
    front()/back()
    push_bakc()/pop_back()
    push_front()/pop_front()
    begin()/end()
    []

set/mutiset

set, map, mutiset, mutimap, 基于平衡二叉树(红黑树),动态维护有序序列
公有的操作:
    size()
    empty()
    clear()
    begin()/end()  ++, --   返回前驱和后继,时间复杂度O(logn)
    
 set/mutiset  (key = value)              元素自动排好序
    set元素不可以重复,mutiset元素可以重复
 
     insert()                插入一个数
     find()                  查找一个数,不存在返回end迭代器
     count()                 返回某一个数的个数
     erase()     
            1. 输入一个数x,删除所有x     O(k + logn)
            2. 输入一个迭代器,删除这个迭代器
    lower_bound()/upper_bound()
          1. lower_bound(x)  返回大于等于x的最小的数的迭代器
          2. upper_bound(x)  返回大于x的最小的数的迭代器

map/mutimap

map/mutimap                  所有元素按照key自动排序
    map所有的元素是pair,拥有key和value
    map 不允许俩个元素拥有相同的键值
    mutimap 允许俩个元素拥有相同的键值
    map迭代器不允许改变map元素的key,否则影响排序,但是可以修改value
    
    insert()                插入的数是一个pair
    erase()                 输入的参数是pair或迭代器
    find()          
    []                      核心: 时间复杂度为O(logn) mutimap没有该操作
    lower_bound()/upper_bound()
    
map<string, int> a;
a["xdm"] = 1;
cout << a["xdm"] << endl;    // 1

unorder_set, unorder_map, unorder_mutiset, unorder_mutimap

 unorder_set, unorder_map, unorder_mutiset, unorder_mutimap
 
    和上面类似,增删改查的时间复杂度是    O(1)
    不支持lower_bound()/upper_bound(),   迭代器的 ++, --

bitset

bitset,  压位
    bitset<10000> s;
    ~, &, |, ^
    >>, <<
    ==, !=
    []
    count()       返回有多少个1
    any()         判断是否至少有一个1
    none()        判断是否全为0
    set()         把所有的位置为1
    set(k ,v)     把第k位置为1
    reset()       把所有位置为0
    flip()        等价于~
    flip(k)       把第k位取反
目录
相关文章
mailto用法详解
mailto用法详解
536 0
mailto用法详解
propertyIsEnumerable的用法
propertyIsEnumerable用法 语法和功能 obj.propertyIsEnumerable(prop): 判断prop属性是否是obj的可枚举属性
183 0
|
存储 SQL Oracle
DatabaseMetaData的用法(转)
DatabaseMetaData的用法(转)
597 0
EasyTouch基本用法
EasyTouch基本用法 本文提供全流程,中文翻译。Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例) ...
1523 0