CSP 前夕——STL再度整理

一.vector

1)定義: vector < int > a;
  • 其實就是一個不定長(動態)的數組,即你存多少元素他就佔多少的存儲空間
2)具體操作:

1.a.size():返回vector數組a的實際長度
2.a.empty():返回vector數組a是否爲空,若爲空,則返回1
3.a.clear():清空a數組
4.a.push_back(x):在a後面插入元素x,相當於數組的a[++len] = x
5.a.pop_back():彈出末尾的元素
6.a.back() / a.front():返回末尾/開頭的元素
7.a.begin / a.end():指向第一個元素的迭代器和vector的尾部(前閉後開)

3)遍歷數組

  • vector是支持隨機訪問的,用法與數組相同.但下標是從0開始的
for (int i = 0; i < a.size(); i++) cout<<a[i]<<' ';

4)迭代器遍歷

  • 迭代器相當於stl的指針,可以用*引用
    聲明方法:vector < int >::iterator it
    此時就可以和上述7.一起用了
for (vector < int > :: iterator it = a.begin(); it != a.end(); it++) cout<<*it<<endl;

當然vector也可以用來建圖


二.queue

1)循環隊列

定義:queue < int > q;

具體操作:
1.q.push(x)
2.q.pop()
3.q.front()
4.q.size() / q.empty()
q.back()

2.優先隊列

定義:
1.:priority_queue<int>q / priority_queue< int , vector < int > , less < int > > q;1.大根堆: priority\_queue < int > q\ /\ priority\_queue <\ int\ ,\ vector\ <\ int\ >\ ,\ less\ <\ int\ >\ >\ q;
2. priority_queue< int , vector < int > , greater < int > > q;2.小根堆 \ priority\_queue <\ int\ ,\ vector\ <\ int\ >\ ,\ greater\ <\ int\ >\ >\ q;
3.pair類型小根堆:
priority_queue< pair < int , int > , vector < pair < int , int > > , greater < pair < int , int> > >qpriority\_queue <\ pair\ <\ int\ ,\ int\ >\ ,\ vector\ <\ pair\ <\ int\ ,\ int\ >\ >\ ,\ greater\ <\ pair\ <\ int\ ,\ int >\ >\ > q
4.pair類型大根堆:
priority_queue< pair < int , int > , vector < pair < int , int > > , less < pair < int , int> > >qpriority\_queue <\ pair\ <\ int\ ,\ int\ >\ ,\ vector\ <\ pair\ <\ int\ ,\ int\ >\ >\ ,\ less\ <\ pair\ <\ int\ ,\ int >\ >\ > q

具體操作:
1.q.top(): 返回堆頂元素
2.q.push(x) : 將元素x放入堆
3.q.pop() : 彈出堆頂元素

3.雙端隊列

定義: deque < int > q

具體操作:

1. []: 可隨機訪問
2. q.begin() / q.end()
3. q.front() / q.back()
4. q.push_back(x) / q.push_front(x)
5. q.pop_back() / q.pop_front()
6. q.clear()


三、set

1)定義:

  1. set < int > s;//有序集合
  2. multiset < int > s;//有序多重集

2)具體操作:

1. s.size() / s,empty() / s.clear()
2. s.begin() / s.end()
3. set < int > :: iterator it
4. s.insert(x):插入x
5. s.find(x): 尋找元素x,並返回指向該元素迭代器
6. s.lower_bound(x) , s.upper_bound(x)
7. s.erase(it) : 刪除迭代器it指向的元素 / s.erase(x) : 刪除集合中所有大小爲x的元素
8. s.count(x) : 返回集合中x元素的個數


四、map

1)定義: map < 類型1 , 類型2 > M;

  • 即將類型1映射到類型2 , 相當於hash吧

2)具體操作

1. [ ] : 直接訪問
//其他的用不太到,也跟上面的類似

五. biset

1)定義: biset < 10000 > s;

  • 相當於一個10000位的二進制數組

2)具體操作

1. 位運算操作符

  • ~s : 將s取反
  • & , | , ^ : 返回兩個biset按照位運算執行的結果
  • << , >> ,返回把一個biset左移、右移若干位的結果

2. [ ]:直接操作
3. s.count(): 返回有多少位是1
4. s.any(): 若所有爲都爲0,則返回false;若至少有一位是1,則返回true
5. s.none():若s至少有一位是1,則返回false;若都是0,則返回true
6. s.set(): 把s所有位都變成1
7. s.reset() : 把s的所有位變成0
8. s.flip() : 把s的所有位取反


五、序列上的函數操作

1)reverse :翻轉

1.vector:reverse(a.begin(),a.end());1. vector : reverse(a.begin() , a.end() );
2.:reverse(a+1,a+n+1);2. 數組 : reverse(a+1,a+n+1);

2) unique : 去重

  • 可以用於離散化
    1.vector:int m=unique(a.begin,a.end())a.begin();vector : int\ m = unique(a.begin , a.end()) - a.begin();//此時m返回的是去重後vector的長度,即不同的元素的個數
  1. 數組: int m=unique(a+1,a+n+1)(a+1)int\ m = unique(a+1 , a+n+1) - (a+1)

例如 a[]={1,1,2,3,3,4}a[] = \{1,1,2,3,3,4\},那麼通過一番操作後 m=4 , a[]={1,2,3,4}m = 4\ ,\ a[]=\{1,2,3,4\}

3) next_permutation : 全排列

for (int i = 1; i <= n; i++) a[i] = i;
do{
	for (int i = 1; i <= n; i++) cout<<a[i]<<' ';
}while (next_permutation(a+1,a+n+1));

4) sort : 排序

  • 不用說吧
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章