stl 提供三種型別的元件:容器、迭代器和演算法,它們都支援泛型程式設計標準。在acm中充分利用stl可以大大的簡化程式,提高解題效率。
1、容器主要有兩類:順序容器和關聯容器。順序容器(vector/list/deque/string)等是一系列元素的有序集合。關聯容器(set/multiset/map/multimap)包含查詢元素的鍵值。
2、迭代器的作用是遍歷容器。
3、stl演算法庫包含四類演算法:排序演算法,不可變演算法,變序演算法和數值演算法。
常用的容器:
1、vector
vector的記憶體管理是這樣的,在分配小於等於128個位元組的記憶體的時候,採用記憶體池的方式,否則也是直接每次都呼叫c的malloc函式。
vectorv;
v.push_back(data);
for(vector::iterator it = v.begin();it!=v.end();it++)
accumulate(v.begin(),v.end(),0); //從begin加到end,再加0
也可以用定義陣列的方式:
vectorv(3);
v[0]=3;
v[1]=4;
v[2]=8;
coutvector的插入:vec.insert(vec.begin()+i,20);
vector的刪除:vec.erase(v.begin+i); //刪除第i+1個元素
vec.erase(v.begin,v.begin()+3);//刪除第一到第四個元素
vec.clear(); //全部清除
vector的反**#includereverse(v.begin(),v.end());
其實陣列也可以用這個函式來反轉
vec.size()
vec.empty()-->bool
用sort來排序,引入algorithm標頭檔案
sort(v.begin(),v.end()); //預設的是公升序排列
也可以自定義比較函式
bool comp(const int &a, const int &b)
然後呼叫:sort(v.begin(),v.end(),comp);
2、string
string str = "lingyibin";
string::iterator it=str.begin();
然後再for,和vector一樣。
str.replace(3,1,"g"); //3是從0開始算的
str.compare("ling"); //str大,則返回1,等則0,小則-1
str用printf輸出:printf(str.c_str());
str.find('d'); //返回找到的位置,找不到時返回-1
str.find("yi");
當然string也可以通過str[i]這種格式來訪問,得到的結果是乙個char
把char陣列賦值給string的可以,但反過來就不行了。
3、set
set集合是乙個實現了紅黑樹的平衡二叉檢索樹。
裡面的元素不會重複,而且是有序。
如:sets;
s.insert(34);
s.insert(3);
s.insert(27);
s.insert(31);
s.insert(3);
for(set::iterator it = s.begin(); it != s.end(); it ++)
結果是: 3
27 31
34
反向遍歷set:
set::reverse_iterator rit;
for(rit = s.rbegin();rit!=s.rend();rit++) cout<<*rit<
it = s.find(21);
if(it!=s.end()) //找到
cout<<"找到了"//set的自定義比較函式
struct mycmp
}; setmyset;
//如果set裡面是乙個結構體的話,直接把比較函式寫到結構體裡面
struct info
} 4、map 和set一樣,也是紅黑樹結構,不允許重複,用法和set差不多
mapm;
for(it = m.begin(); it != m.end(); it++)
map的查詢:
map::iterator it;
it = m.find(28);
if(it!=m.end()) ……//說明找到了
5、雙向佇列:deque(頭進尾出)
d.push_back(2);//從後端推入
d.push_front(3);//從後端推入,並覆蓋已有元素
d.insert(d.begin()+2,89);//中間插入,會覆蓋原來的元素
d.pop_back();//從尾部刪除
d.pop_front();//從頭部刪除
6、list
listl;
#include
list::iterator it;
it = find(l.begin(),l.end(),5);
l.sort();//鍊錶的排序
7、bitset
#include
bitset<10> b;
b[1]=1;
b[6]=1;
b[9]=1;
b.set();//置位-->1111111111
b.reset();//置0
8、stack
stack的幾個常用方法
s.push(33);
s.top();
s.pop();
s.size();
s.empty();//0或1
9、queue
queue的幾個常用方法
q.push(33);
q.pop();
q.front;
q.back();
q.empty();
q.size();
10、priority_queue
priority_queue//大的先出隊
過載《來改變出隊順序
struct info
} priority_queue其它操作和stack一樣
……其它的就不一一列出了,有興趣可以自己google吧!^_^
STL在ACM競賽中的使用
string類具有的優點 可以直接用四則運算符和關係運算子,簡化了字串型別的操作。cpp view plain copy print?string string1 22 string2 11 string1 string2 類似於strcat intlength string1.length 類似於...
bitset在acm中的應用
ps 最近碰到一些用bitset優化常數的題目,以前也有接觸但是都沒有記下來,所以來寫一篇博文 記錄以後碰到的類似的題目。應用一 優化boolean multiplication 在做dp的時候,有時候會需要將兩個dp矩陣相乘,且矩陣的元素都是bool型。計算矩陣a b c c i,j 1 當且僅當...
STL在競賽中的應用
題解 合併兩個集合,放於同一陣列排序,輸出時採用set可以去掉相同數。題解 採用棧,進行模擬 使用佇列將輸出答案壓入佇列,最後輸出。題解 使用全排序 next permutation a.begin a.end 從小到大列舉。以及vector儲存。題解 使用map字典,對字串進行處理。題解 棧的應用...