STL中的基本資料結構與演算法

2022-08-16 02:48:14 字數 4118 閱讀 5080

目錄

二、常用演算法

入門篇:

stl(standard template library)是c++的標準模板庫,很多競賽常用的資料結構、演算法在stl中都有,熟練掌握能極大簡化程式設計。

stl的容器分為兩類

​ ①順序式/序列容器(底層主要採用向量和鍊錶)

​ 常見的有:vector、list、stack、queue、deque、priority_queue等

​ vector與list優缺點正好相反

​ ②關聯式/關聯容器(底層主要採用平衡二叉搜尋樹結構)

​ 常見的有:set、map、multiset、multimap等

簡要特性

通用操作

//迭代器

x.begin();//返回容器首個元素的迭代器

x.end();//*返回容器尾元素的後乙個位置的迭代器

//反向迭代器

x.rbegin();//返回容器尾元素的迭代器

x.rend();//返回容器首元素的前一位置的迭代器

x.size();//返回容器元素數量

x.empty;//判斷容器是否為空

//非通用

x.clear();//刪除所有元素,僅vector、map、set...

d;//像陣列一樣,支援隨機訪問,僅vector、map...

接下來先具體介紹幾種常見的容器。

stl中的vector向量是一種動態陣列(可變長陣列),在執行時能根據需要自動改變陣列大小。

特點:可隨機訪問,但插入刪除較慢

需要掌握

棧是一種先進後出的容器(可以理解為泡騰片的拿入拿出)

棧頂新增,棧頂彈出

需要掌握

queue是一種先入先出的容器。

隊尾新增,隊首彈出

需要掌握

stl的list是資料結構中的雙向鍊錶,記憶體空間不連續,通過指標來訪問

特點:可高效率在任意地方刪除與插入,但不支援隨機訪問(訪問較慢)

需要掌握

set是乙個自動實現無重且按一定規則排序的集合

需要掌握

map是乙個無重有序的不同型別之間對映的集合

是一組鍵值對的組合,按鍵排序,鍵和值可以是任意的型別。

需要掌握

lower_bound()、upper_bound()可以分別求出以陣列中或容器中當前元素為下界/上界的下乙個元素

但是前提是陣列或容器本身已經是有序的!!【已排序的陣列 或map以及set】

lower_bound(first, end, val)//找到有序容器或陣列中第乙個大於等於val的位置

upper_bound(first, end, val)//找到有序容器或陣列中第乙個小於等於val的位置

//first、end可以是容器的迭代器,或者陣列的位址

next_permulation()——生成比當前陣列/字串排列大的下乙個排列

next_permulation(a,a+n);//根據陣列a的排列找出下乙個比它排列大的陣列,並更新a

next_permulation(s.begin(),s.end());//根據字串s的排列找出下乙個比它排列大的字串,並更新s

sort()——可以實現對數、字串、二元組pair、結構體甚至stl容器的排序

預設公升序排序,可自定義排序規則cmp

此處先簡要介紹對基本型別以及字串的排序

/* 整型陣列的排序 */

bool cmp(int a, int b)//自定義整型的降序cmp

return a > b;

int a[n];

for(int i = 0; i < n; i++)

cin << a[i];

sort(a, a + n);//對陣列a[0]-a[n-1]的元素公升序排序![)

sort(a, a + n, cmp);//預設公升序,我們可以寫個降序的cmp

/* 字串對字元的排序 */

string a;

//scanf("%s", &a[0]);//用scanf()輸入只需要a[0]首位址

cin >> a;

sort(a.begin(), a.end());

printf("%s",a.c_str());//不能用cout輸出字串

以上都是sort(a, b)的形式,預設以公升序排序

自定義排序規則,需要在使用sort時新增自定義的比較函式cmp()

/* 對整型 */

sort(a, a+n, cmp);

//預設公升序

bool cmp(int a,int b)

return ab;

/* 對字串 */

sort(a.begin(), a.end(), cmp)

//預設公升序

bool cmp(char a,char b)

return ab;

bitset可以理解為乙個存放二進位制的陣列,我們可以將整型、字串存入bitset中。

//初始化與各型別的輸出

bitset<5> b;//初始化5位的二進位制位陣列,預設均為0

cout << b << endl;;

int u1 = 1;

bitset<5> b1(u1);//將整型初始化為5位二進位制,不足左邊補0

cout << b1 << endl;//u1 = 1,則被初始化為00001

string s2 = "1101";

bitset<5> b2(s2);//將字串初始化為5位二進位制,不足左邊補0

cout << b2 << endl;;//s2=」1101「,則被初始化為」01101「

string s3 = "110100";

bitset<5> b3(s3);//當字串足夠時,則取左邊5個

cout << b3 << endl ;//s3為」1101「,則被初始化為」11010「

//bitset<5> b(s, pos, n); //取字串的s[pos]開始,n位長度

bitset<5> b4(s3, 1, 2); //「10」—>00010

cout << b4 << endl;

cout << (b4 >> 1) << endl;//右移一位

//注意是逆序儲存進下標的,下標低的表示低位

for(int i = 0; i< 5; i++)

cout<< b4[i];

cout << endl;

//其它操作

cout << endl << b.any();//b中是否存在1的二進位制位?

cout << endl << b.none();//b中不存在1嗎?

cout << endl << b.count();//b中1的二進位制位的個數

cout << endl << b.size();//b中二進位制位的個數

cout << endl << b.test(2);//測試b下標為2處是否二進位制位為1

cout << endl << b4.test(1);//測試b4下標為2處是否二進位制位為1

b.set(4);//下標4變為1

b.reset();//所有位歸零

b.reset(3);//下標3處歸零

b.flip();//b的所有二進位制位逐位取反

演算法 基本資料結構

1 後進先出 2 棧有乙個屬性為s.top執行最新插入的元素 3 彈出稱為pop,插入稱為push 4 上溢和下溢 如果試圖對乙個空棧執行彈出操作,則稱為下溢 如果s.top超過了n,則稱為上溢,在下面偽 中不考慮上溢問題 1 先進先出 2 佇列有對頭head和對尾tail 3 插入稱為入隊 enq...

資料結構與演算法分析記錄 基本資料結構

單鏈表 struct node 找到某一元素 position find elementtype x,list list 刪除某一元素 void delete elementtype x,list l 找到目標元素前的元素 position findprevious elementtype x,li...

基本資料結構與演算法 之陣列

1.mxn的矩陣,若某個元素值為0,則將其所在的行和列全置為0。定義行陣列rows,列陣列cols。如果a i j 為0,則將rows i 和cols j 置為true。當遍歷完整個a陣列後,根據rows和cols的值對矩陣進行修改。2.陣列a,將a 0 a p 和a p 1 a n 1 這兩段交換...