1. 程式人生 > >qluoj第一次講課筆記(shawn zhou大佬)

qluoj第一次講課筆記(shawn zhou大佬)

第一次聽大佬線上講題,雖然講的是一些基礎,但是從這裡就深深的感受到了自己和大佬的差距非常之大
如果想填補差距,那就只能一直不斷的學習!
下面是我對這次講課的基本整理(是我聽講的時候寫的,感覺會有點用的吧233)

1.1 容器 多種多樣的資料結構
(2 迭代器 用來遍歷容器的工具
(3 演算法 algorithm

----------------------------------------------------------------------------------------------------

2.
 要想使用特定的容器,需要加上對應的標頭檔案

example: 棧  #include<
stack> 佇列#include<queue> stl堆->優先佇列 在queue裡 priority_queue優先佇列: stl 的容器可以自動調整大小 所以並不用定義大小 ------stl棧 可以實現棧的所有基本功能: 假設現在有一個stack<int>s; s.push(item); //將item壓入棧頂 s.pop(); //刪除棧頂的元素,但不會返回 s.top(); //返回棧頂的元素,但不會刪除 s.size(); //返回棧中元素的個數 s.empty
(); //檢查棧是否為空,如果為空返回true,否則返回false ------stl佇列 可以實現佇列的所有基本功能: queue<int>a; q.push(item) //將item壓入佇列尾部 q.pop() //刪除隊首元素,但不返回 q.front() //返回隊首元素,但不刪除 q.back() //返回隊尾元素,但不刪除 q.size() //返回佇列中元素的個數 q.empty() //檢查佇列是否為空,如果為空返回true,否則返回false
------stl優先佇列 可以實現堆的所有基本功能 名字是優先佇列,但是滿足堆的性質。 插入和刪除的複雜度o(logn)。比較優秀,可以代替手寫堆 priority_queue<int>a; q.push(item) //將item壓入佇列尾部 q.pop() //刪除隊首元素,但不返回 a.top() // queue裡面為a.front(); q.back() //返回隊尾元素,但不刪除 q.size() //返回佇列中元素的個數 q.empty() //檢查佇列是否為空,如果為空返回true,否則返回false 如果寫priority_queue生成一個小根堆 資料從小到大 同下 自動排序好 如果要生成大根堆 :priority_queue<int,vector<int>,greater<int>>q; 此時是從大到小 (優先佇列自動排序 即輸入無序的東西以後要是輸出的話自動排序) 每次進隊以前對資料進行一次比對,然後將輸入的數調整到合適的位置 -------向量和雙端佇列:: 這裡的向量和向量的定義不太一樣 它的本質就是一個不定長的陣列,有的地方也叫它動態陣列。 需要#include<vector> 當你需要一個數組但是並不知道應該用多大(但是可能會很大)的時候 vector就可以派上用場了 vector<int>v; v.chear();清除 v.push_back(i);壓入元素(隊尾) v.size();取一下元素個數 v.pop_back();將最後的一個刪除 vector還有一個insert的用法,可以在中間插入什麼的= = ! 雙端佇列 支出在兩端進行插入和刪除,但是普通佇列只能一端 入隊首:q.push_front(); 刪除隊首:q. 集合 對映 對組(關聯容器) 序列式容器各個元素之間有關係(實體地址連線) 但是關聯容器的內部構造和上面不一樣 (使用迭代器遍歷) ------集合: 集合是一個關聯容器,定義就是一個集合 元素是唯一的 時間複雜度為o(logn)(好像挺快的吧我也不是很清楚23333 由於刪除和插入都是按照寫好的排序規則插入,所以不能指定位置插入 set不允許直接存取元素 用迭代器 去重 排序; #include<set> 使用insert()向set裡面插入一個或者多個元素,引數為1的時候是插入一個人值 當引數為2的時候傳入倆指標 傳入資料段的起始地址 begin()    //返回set容器的第一個元素 end()      //返回set容器的最後一個元素 clear()    //刪除set容器中的所有的元素 empty()    //判斷set容器是否為空 max_size()   //返回set容器可能包含的元素最大個數 size()      //返回當前set容器中的元素個數 rbegin     //返回的值和end()相同 rend()     //返回的值和rbegin()相同 這裡有一段程式碼 實現了set的基本操作 #include <iostream> #include <set> using namespace std; int main() { set<int> s; s.insert(1); s.insert(2); s.insert(3); s.insert(1); cout<<"set 的 size 值為 :"<<s.size()<<endl; cout<<"set 的 maxsize的值為 :"<<s.max_size()<<endl; cout<<"set 中的第一個元素是 :"<<*s.begin()<<endl; cout<<"set 中的最後一個元素是:"<<*s.end()<<endl; s.clear(); if(s.empty()) { cout<<"set 為空 !!!"<<endl; } cout<<"set 的 size 值為 :"<<s.size()<<endl; cout<<"set 的 maxsize的值為 :"<<s.max_size()<<endl; return 0; } //不知道為啥這個maxn_size()很奇怪, ------對映 對映和集合類似,內部實現基本相同,提供了對映功能,可以做字典 比如字元下標或者字串下標 map用的比較多啦 map基於一種鍵連線形成,一個鍵對應一個值,不能重複 可以用鍵來訪問值 使用的時候需要#include<map>a; 由於定義需要定義鍵和值,所以基本為兩個 map<char,int>ma; 向map中插入元素可以用set類似的insert(); 方便一些:ma['a']=1; 遍歷map也需要用到迭代器,但是下標有序的時候,直接遍歷也可以的 map比較方便啦 應用!!!:建立轉換關係 ------對組 可以理解為由倆變數的結構體 第一個變數用.first 第二個.second 需要#include<utility> pair<int,int>a; ------字串 有點類似於vector; #include<string> string s' 與cin相性極好,讀到空格結束cin>>s; 讀到行末 getline(cin,s); string 強在哪裡? 有一個方法叫substr(起始位置 ,包括起始位置在內的向後選取長度) 舉個例子 sring s=23333333” s.substr(35=33333”; 此外 string 可以直接相加 支援直接判斷相等和大小 s.length()<==> s.size()返回串的長度 ------------------------------------------------------------------------------------------------------------ -----迭代器初步 簡單理解為已終結樓或者一種物件 行為上像迭代器的東西都可以叫做迭代器,實際上每一種容器都有自己的迭代器 set只能用迭代器來遍歷 棧,佇列,堆都是運算受限的資料結構,用不到迭代器 對於絕大多數容器來說 .begin()返回起始數值 a.end()返回最終的 for(vector<int>::iterator it=v.begin();it!=v.end;it++) cout<<*it;//遍歷vector map的遍歷: for(map<char,int>::iterator it=ma.begin; it!=ma.end();it++) cout<<it->first>>" ">>it->second>>endl; ------------------------------------------------------------------------------------------------------------ stl中的演算法 ------排序和亂序 排序演算法 類似::快速排序 sort(起始位置迭代器,終止位置迭代器) 類似::歸併排序stable_sort(起始位置迭代器,終止位置迭代器) 1.省事 排序可以任意型別! 2.省事 3.自定義排序 sort(a,a+10,greater<int>()); 另一種是過載運算子 bool operator<(const str&rhs)>const { return x<rhs.x; } lhs left hand side 左運算元 rhs right hand side 右運算元 bool operator<(const str &rhs)const>return mat>rhs.mat||(mat==rhs.mat)rhs.eng>eng; } 亂序。。。 傳入的時候和sort一樣 不過功能和sort相反 random_shuffle(a,a+10);//全部打亂!!! -------排列和去重 next_permutation 可以對一個區間的數進行排列並且生成下一個排列 while(next_permutation(a,a+4)); unique去重函式 直到完全相反的時候返回一個flase 直接退出迴圈 (可以生成全排列) a[8]={2,2,3,3,4.4.5,5}; int *end=unique(a,a+8) for(int *i = a; i != end; i++) cout << *i << " "; -------其他 swap 交換兩個任意相同型別的值 min 和 max 返回兩者最小/最大值 ----------------------------------------------------------------------------------------------------------- 太!慢!了! stl::sometimes tle 2333