C++中堆的使用及自定義型別排序
簡介
C++中堆(heap)是在vector的基礎上實現的。具體地,是定義了一些方法在vector型別資料上進行操作,包括
- make_heap 建立堆(預設最大堆)
- push_heap 加入元素
- pop_heap 刪除元素
- sort_heap 堆排序義的一些方法
程式碼示例
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
/* 自定義資料型別:包含一個整數、一個浮點數 */
typedef struct DoubleIndex
{
int id; // index
double val; // value
DoubleIndex(){}
DoubleIndex(int _id, double _val): id(_id), val(_val){}
/* 切記定義運算子過載 */
bool operator < (const DoubleIndex &b) const { return val < b.val; }
bool operator > (const DoubleIndex &b) const { return val > b.val; }
} DoubleIndex;
/* 比較函式 */
bool CompareDoubleIndex(const DoubleIndex &a, const DoubleIndex &b){
return a.val < b.val;
}
int main()
{
vector<DoubleIndex> list;
vector<DoubleIndex>::iterator iter;
/// 初始vector列表
list.push_back(DoubleIndex(1 , 3.1));
list.push_back(DoubleIndex(2, 1.1));
list.push_back(DoubleIndex(3, 4.1));
list.push_back(DoubleIndex(4, 2.1));
list.push_back(DoubleIndex(5, 0.1));
/// 建立堆,make_heap這一步將上面的列表構造成一個堆
make_heap(list.begin(), list.end(), CompareDoubleIndex);
for(iter=list.begin();iter!=list.end();++iter)
cout<<(*iter).id << ":" << (*iter).val<<endl;
cout<<endl;
/* 初始堆
3:4.1
4:2.1
1:3.1
2:1.1
5:0.1
*/
/// 加入元素第一步:新元素壓入vector列表
list.push_back(DoubleIndex(6,10.1));
for(iter=list.begin();iter!=list.end();++iter)
cout<<(*iter).id << ":" << (*iter).val<<endl;
cout<<endl;
/* 這是加入vector的效果,可以看到,新元素被放在了列表末尾
3:4.1
4:2.1
1:3.1
2:1.1
5:0.1
6:3.65
*/
// 加入元素第二步:新元素加入堆
push_heap(list.begin(), list.end());
for(iter=list.begin();iter!=list.end();++iter)
cout<<(*iter).id << ":" << (*iter).val<<endl;
cout<<endl;
/* 可以看到,新元素[6:3.65]更新了原先第二層右邊的節點[1:3.1]
3:4.1
4:2.1
6:3.65
2:1.1
5:0.1
1:3.1
*/
/// 堆排序
sort_heap(list.begin(), list.end());
for(iter=list.begin();iter!=list.end();++iter)
cout<<(*iter).id << ":" << (*iter).val<<endl;
cout<<endl;
/*
5:0.1
2:1.1
4:2.1
1:3.1
6:3.65
3:4.1
*/
return 0;
}
相關推薦
C++中堆的使用及自定義型別排序
簡介 C++中堆(heap)是在vector的基礎上實現的。具體地,是定義了一些方法在vector型別資料上進行操作,包括 - make_heap 建立堆(預設最大堆) - push_heap 加入元素 - pop_heap 刪除元素 - sort_h
List泛型自定義型別排序和大小比較C#版
想刪除一堆大小相同的檔案,於是想到用List泛型自定義型別排序和大小比較,準備先大小排序,再比較刪除同大小的 1、隨便來個自定義類 public class FileSort { long filesize; public long
C# 泛型集合的自定義型別排序
一、泛型集合List<T>排序 經sort方法之後,採用了升序的方式進行排列的。 List<int> list = new List<int>() { 2, 4, 1, 3, 5, -2, 0, 10 }; Console.
Qt中QVariant儲存自定義型別
#include <QDebug> //先宣告類 class Test{ public: QString myName; }; //註冊自定義型別 Q_DECLARE_METATYPE(Test) int main(int argc, char *argv[]) {
SpringMVC的ResponseBody註解及自定義型別
建立自定義類 根據專案需要定義成員變數 public class AkResponse implements Serializable { private String msg;
C# 中,ListView的自定義顯示,可用於顯示不同的顏色和字型等
VS2010下的ListView控制元件,想用它來顯示不同的顏色單元格,在網上找了listView1.Items[i].UseItemStyleForSubItems = false;的方法,但是不知道為何不起作用, 所以又搜尋了OwnDraw的方法,本來以為很複雜,但後來
Golang對自定義型別排序
在實際專案中用到對結構按結構體中的某個欄位進行排序,在網上查到一個比較好的辦法,mark一下。 首先golang的sort包提供了基本的排序,包括插入排序(insertionSort)、歸併排序(symMerge)、堆排序(heapSort)和快速排序(quickSort)
C++中對hash_map自定義雜湊函式和比較函式的理解
#include "stdafx.h" #include <iostream> #include <hash_map> #include <vector>using std::vector; using stdext::hash_map;class hash_wchar_
C++ MFC中添加自定義消息映射宏及添加消息響應函數
c++ mfc sindsun 反射消息映射宏 下面是我自己在學習C++過程中遇到的問題及解決過程,我把這個共享出來,希望能幫到遇到同樣問題的同胞! 一、添加消息響應函數 afx_msg void OnOwnerDraw(NMHDR * pNotifyStruct, LRESULT* pRes
JAVA高階基礎(10)---TreeSet對自定義型別進行定製排序及增強for迴圈遍歷集合
TreeSet 自然排序 對於自定義型別,那麼要實現自然排序,需要去 Comparable 介面中的 compareTo 方法。在 compare To 方法中我們可以根據自己的業務要求,來實現自己的排序規則。 定製排序 在建立容器
C++中自定義型別列舉型別
不限定作用域列舉型別說明: 列舉元素是常量,不能對它們賦值 例如有如下定義enum Weekday {SUN, MON, TUE, WED, THU, FRI, SAT}; 不能寫賦值表示式:SU
\t\t在MSSQL中定義和使用C#自定義型別 SQL Server08表型別引數傳遞
在學習SQL Server 2008的過程中,突然發現SQL Server支援自定義表型別,我們可以輕鬆的將一個SQL Server 2008表型別作為引數傳遞給儲存過程。C#下實現了SQL Server 2008表型別引數傳遞本示例中用到的型別在資料庫中的位置:建立一個自定義表型別CREATE TYPE [
Mapreduce中的 自定義型別、分組與二次排序
0、需求說明 資料格式 期望輸出的結果 做簡單分析: a. 由於只有兩列,所以可以將map的InputFormat設定為KeyValueTextInputFormat b. 事實上這裡實現了兩個排序,即對輸出的k
java使用apk-parser解析apk,獲取manifest中的版本號及自定義變數
apk-parser地址: https://github.com/hsiafan/apk-parser 1.獲取版本號等資訊: try (ApkFile apkFile = new ApkFile(new File(filePath))) { ApkMeta apkMeta
js中陣列物件自定義排序
<!DOCTYPE html> <html> <script> var data = [{name:"zachary", age:28}, {name:"nicholas", age:29}]; function f1(name){ return functi
JAVA 排序自定義型別元素集合
排序程式碼 public class Collection_sort3 { public static void main(String[] args) { List <Points> list = new ArrayList<Points&g
[Visual Studio C++] [MFC] 新增使用者自定義訊息及訊息響應函式講解
一、前言 本文介紹 兩種方法 新增使用者自定義訊息及訊息響應函式。 第一種,使用者手動新增兩個檔案((.h)和 (.cpp))的內容。 第二種,利用 MFC 的整合功能,自動新增。(推薦
try、catch、finally中return的執行順序及自定義異常建立
1.在Java中使用 try/catch語句捕獲異常 說明 throw和throws的區別? 1.作用不同:throw用於程式設計師自行產生並丟擲異常,throws用於宣告該方法內丟擲了異常。 2.使用的位置不同:throw位於方法體內部,可以作為單獨語句使用。throws必須跟在方
C++學習之自定義型別
我們在C語言裡面學習了結構體,在C++中的結構體和C中的結構體不一樣。C++允許新增建構函式,成員方法,訪問許可權等等。在C++中還有一種型別叫做類,也可以有成員方法,訪問許可權和建構函式,成員變數等等。那麼這之間有什麼區別呢?其實沒有區別,唯一的區別就是在不宣告許可權的時候預設許可權問題。
C語言:自定義型別部分知識點
>結構體型別建立 結構的基礎知識:結構是一些值的集合。這些值稱為成員變數。結構的每個成員可以是不同型別的變數。 結構的宣告: struct Stu { char name[20];//名字 int age;//年齡 char sex[15];