Sort排序+STL佇列+優先佇列小結
Sort排序:
普通陣列:
sort排序比qsort排序簡單多了,這裡只對sort排序做了總結。
標頭檔案: #include<algorithm> using namespace std ;
sort(陣列名,陣列名+元素個數) ;例如:int/char/double a[ 1000 ] ; 假設裡面已經賦了n個值,sort(a,a+n);這是從小到大排序。 sort(陣列名,陣列名+元素個數,cmp) ;int/char/double cmp(int/char/double a ,int/char/double b ){ return a > b ; }從大到小排序。
結構體排序:
直接上程式碼:
#include<stdio.h> #include<algorithm> using namespace std; struct zhang { int x,y; }t[1000]; bool cmp(zhang a,zhang b) { return a.x > b.x ;//按x從大到小排序 "<"從小到大排序 同普通陣列 // strcmp(a.s,b.s) > 0 ? 1 : 0 ; // 比較字串,大於0 降序,反之升序 } int main() { for(int i=0;i<10;i++) scanf("%d%d",&t[i].x,&t[i].y); sort(t,t+9,cmp); for(int i=0;i<9;i++) printf("%d %d\n",t[i].x,t[i].y); return 0; }
STL佇列:
概念: Queue佇列容器是一個先進先出的線性儲存表,元素的插入只能在隊尾,元素的刪除只能在隊首。
使用Queue需要宣告標頭檔案“#include <queue> + using namespace std ”;
基本運算:
queue<int>q;申請q的佇列
q.push():入隊,即插入元素
q.pop():出隊,即刪除元素
q.front():讀取隊首元素
q.back():讀取隊尾元素
q.empty():判斷佇列是否為空,是返回 1 ,不是返回 0 。
q.size():隊列當前元素有多少
STL 棧 :
概念: 棧和佇列其實差不多,棧是後進先出的一種線性儲存表。使用時需要申明標頭檔案“#include<stack> + using namespace std ”。不管棧還是佇列在做題時執行完一定要記得清空。
基本運算:
stack<int>s ;申請棧
s.push( ) : 入棧,即插入元素
s.pop( ) : 出棧,即刪除元素
s.top( ) : 讀取隊首元素(此處與佇列不同)
s.empty( ) : 判斷佇列是否為空,是返回 1 ,不是返回 0 。
s.size( ) : 棧當前元素有多少
優先佇列:
概念: 優先佇列和STL佇列不同之處就是優先佇列可以按照優先順序出隊(可以進行排序),在優先佇列中,優先順序高的元素先出佇列。標準庫預設使用元素型別的 < 操作符來確定它們之間的優先順序關係。如果不寫結構體預設為大的優先,如果想讓小的先出隊:priority_queue<int, vector<int>, greater<int> >qi2;
基本運算:標頭檔案#include<queue> using namespace std;
#include<stdio.h>
#include<queue>
using namespace std;
struct zhang
{
int x,y,z;
friend bool operator<(const zhang &a,const zhang &b)//operator後 " < " 很重要!!
{
return a.x < b.x ;//從大到小出隊 " > " 從小到大出隊
}
};
priority_queue<zhang>q;//儘量把這個放進int main()裡
zhang current,next;
比較多個數出隊:
#include<stdio.h>
#include<queue>
using namespace std;
struct zhang
{
int x,y,z;
friend bool operator<(const zhang &a,const zhang &b)
{
if(a.x!=b.x)
return a.x < b.x ;//從大到小出隊 " > " 從小到大出隊(和普通排序相反)
else if(a.y!=b.y)
return a.y > b.y ;//從大到小出隊
else
return a.z < b.z ;
}
};
priority_queue<zhang>q;
zhang current,next;
不比較優先順序:
#include<stdio.h>
#include<queue>
using namespace std;
struct zhang
{
int x,y,z;
};
queue<zhang>q;
zhang current,next;
deque(雙端佇列)
簡介:
deque 雙端佇列容器 ( double - ended queue ) 與 vector 非常相似,deque 內部的資料機制和執行效能與 vector 不同,一般來說,當考慮到容器元素的記憶體分配策略和操作的效能時 ,deque 相對於 vector 較為有優勢。deque 雙端佇列採用分塊的線性結構來儲存資料,具有高效的刪除首位元素的函式,由於 deque 容器是以 deque 塊為單位進行記憶體的分配,並使用了二級的 Map 進行管理,因此不容易實現類似於 vector 的 capacity 和 reverse 函式,而且 deque 容器也不需要這樣的獲取和調整容大小的函式。
操作:
建立:
deque<型別>物件名;
deque<int>q ; // 建立一個空的deque物件;
deque<int>q(20) //建立具有n個元素的deque物件;
deque<int>q(20 ,5) ;// 建立一個具有n個元素的deque物件,每個元素具有初始值(這裡為 5);
deque<int> q(20 ,5) ; deque<int> p(q) ; //拷貝物件
int a[10] = {1 ,2 ,3} ,deque<int> q(a ,a+3) ; // 拷貝區間的元素
插入:
q.push_front() ; // 在頭部插入元素
q.push_back() ; // 在尾部插入元素
刪除:
q.pop_front() ; // 刪除頭部元素
q.pop_back() ; // 刪除尾部元素
q.erase(q.begin() + x) ;// 刪除某個位置的元素
q.clear() ; // 清空容器
遍歷:
deque<int>::iterator i ,j ; // 遍歷器
交換:
q.swap(p) ; // 兩個容器的元素交換
vector的功能deque差不多都延續過來了,這裡不再介紹。