qluoj第一次講課筆記(shawn zhou大佬)
阿新 • • 發佈:2018-12-11
第一次聽大佬線上講題,雖然講的是一些基礎,但是從這裡就深深的感受到了自己和大佬的差距非常之大
如果想填補差距,那就只能一直不斷的學習!
下面是我對這次講課的基本整理(是我聽講的時候寫的,感覺會有點用的吧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(3,5) =“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