目錄
二、常用演算法
入門篇:
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 這兩段交換...