1. 程式人生 > >C++中堆的使用及自定義型別排序

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.

QtQVariant儲存定義型別

#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、finallyreturn的執行順序定義異常建立

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];