C++ STL中的自定義排序和vector


優先隊列priority_queue

優先隊列一般寫法

//隊列頭部值最小,小頂堆,每次top就是最小值,dijkstra堆優化就是小頂堆
priority_queue<int, vector<int>, greater<int> >pq;
//大頂堆,每次top就是最大值
priority_queue<int, vector<int>, less<int> >pq;與priority_queue<int>pq等價

自定義排序規則,用於自定義的數據結構,一個int滿足不了。

自定義()運算符,傳入兩個參數,內部寫> 實際上是從小到大排序與sort相反!
寫法一:

struct node
{
    int to,cost;
};
struct cmp
{
    bool operator() (const node &a,const node &b)
    {
        return a.cost > b.cost;
    }
};
priority_queue<node,vector<node>,cmp>priq;

寫法二:

struct node
{
    int to,cost;
    node(int x1,int x2)
    {
        to=x1;
        cost = x2;
    }
    friend bool operator<(const node &a , const node &b)
    {
        return a.cost>b.cost;   // ascending sort
    }

};
priority_queue<node>priq;

優先隊列的包裝函數多,一般是empty(),size(),pop(),top(),push()

set和multiset

以下介紹set,multiset用法類似
一般寫法

set<int>se

自定義排序

struct mynode {
	int end, id;
};
struct  rules
{
	bool operator()(const mynode& a, const mynode& b)
	{
		return a.end < b.end;
	}
};
set<mynode,rules> se;

set可以通過迭代器支持頭部刪除和尾部刪除(也就是一種支持可以刪除最值和動態更新的容器)
當然通過迭代器可以刪除任意位置的元素

//一些用法
se.erase(mset.begin());//刪除第一個
mset.erase(--mset.end());//刪除最后一個
vec.push_back((*(--mset.end())).id);//取出最后一個元素的某個部分

set和multiset用處還是挺大的,常用的也是insert(),erase()(值或者地址),size(),empty()之類的
支持迭代器遍歷。

vector

當然vector是數組,是向量,不能像上面那樣維護動態的平衡樹
這里介紹一下vector作為雙端隊列的使用,以及vector一些不常見的內置函數

// 任意位置插入一個元素
vector<int>::iterator it = vec.begin();
vec.insert(it, 2);
//任意位置插入 n 個相同元素
vec.insert(iterator it, int n, const T& x);

//插入另一個向量的 [forst,last] 間的數據
vec.insert(iterator it, iterator first, iterator last);
vec.resize(10)//會分配 10 個 0 給vec,相當於 push_back(0) 10 次。
push_back()//后面插入
pop_back()//彈出最后一個元素
back()//取出最后一個元素
vec.front();//取出第一個

vec.erase(iterator it);//任意位置刪除一個元素
vec.erase(iterator first, iterator last);//刪除 [first,last] 之間的元素

at 方法訪問:vec.at(1); // 和下標訪問區別就是 at 會檢查是否越界,是則拋出 out of range 異常

vector容器也適用迭代器


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM