STL在ACM中的應用

2021-08-31 08:54:29 字數 3204 閱讀 4709

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字典,對字串進行處理。題解 棧的應用...