欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ 容器適配器仿函數(shù)與priority_queue的使用

 更新時間:2024年09月26日 08:30:18   作者:FITMT  
本文主要介紹了C++ 容器適配器仿函數(shù)與priority_queue的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

容器適配器

適配器是一種設計模式(設計模式是一套被反復使用的、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設計經(jīng)驗的總結),該種模式是將一個類的接口轉換成客戶希望的另外一個接口。 它們的底層都是其他的容器,例如stack和queue的底層容器默認是deque,而priority_queue的底層容器是vector。它們是對這些容器進行了包裝提供了用戶想要的接口。

仿函數(shù)

定義:仿函數(shù)不是函數(shù),而是行為類似函數(shù)的類,它重載了opprator()

仿函數(shù)的優(yōu)勢:

  • 狀態(tài)維護:仿函數(shù)可以持有狀態(tài),每次調用可以根據(jù)狀態(tài)改變行為。
  • 內聯(lián)調用:由于仿函數(shù)是通過對象調用的,編譯器可以輕易地將其內聯(lián),減少調用開銷。
  • 高度定制:可以通過對象的屬性來調整其行為。

示例:

#include <iostream>
#include <algorithm>
#include <vector>
 
class Compare {
public:
    bool operator()(int a, int b) {
        return a < b;
    }
};
 
int main() {
    std::vector<int> numbers = {10, 65, 30, 99, 23};
 
    // 使用仿函數(shù)進行排序
    std::sort(numbers.begin(), numbers.end(), Compare());
 
    std::cout << "Sorted numbers: ";
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
 
    return 0;
}

在這個示例中,Compare是一個仿函數(shù),它重載了operator()來進行整數(shù)比較。我們使用這個仿函數(shù)作為std::sort的比較函數(shù),用來對一個整數(shù)向量進行排序。

priority_queue

priority_queue簡單介紹

priority_queue是一個容器適配器(如stack,queue)它的底層容器是vector。它的行為類似與heap(堆)默認情況下建立的是大堆。它的底層容器必須能支持隨時訪問任意位置的元素(這也是為了滿足建堆的要求)

模擬實現(xiàn)

template<class T>
	struct less
	{
		bool operator()(const T& left, const T& right)
		{
			return left < right;
		}
	};

	template<class T>
	struct greater
	{
		bool operator()(const T& left, const T& right)
		{
			return left > right;
		}
	};

首先實現(xiàn)兩個仿函數(shù)可以用來建立大(?。┒?/p>

然后實現(xiàn)向下和向上調整算法

void AdjustUP(int child)
		{
			int parent = ((child - 1) >> 1);
			while (child)
			{
				if (Compare()(c[parent], c[child]))
				{
					swap(c[child], c[parent]);
					child = parent;
					parent = ((child - 1) >> 1);
				}
				else
				{
					return;
				}
			}
		}

		// 向下調整
		void AdjustDown(int parent)
		{
			size_t child = parent * 2 + 1;
			while (child < c.size())
			{
				// 找以parent為根的較大的孩子
				if (child + 1 < c.size() && Compare()(c[child], c[child + 1]))
					child += 1;

				// 檢測雙親是否滿足情況
				if (Compare()(c[parent], c[child]))
				{
					swap(c[child], c[parent]);
					parent = child;
					child = parent * 2 + 1;
				}
				else
					return;
			}
		}

向上(向下)調整算法

向上調整算法:從最后一個節(jié)點開始與自己的父親比較,如果比父親大(?。┚秃透赣H交換位置,直到調整到根節(jié)點為止

向下調整算法:從根節(jié)點開始,與左右孩子節(jié)點中較大(較小)者比較,若根節(jié)點比較大(小)則交換位置,一直向下調整到最后一個節(jié)點。

接下來就是比較簡單的利用接口進行實現(xiàn)

template<class T, class Container = std::vector<T>, class Compare = less<T>>
	class priority_queue
	{
	public:
		// 創(chuàng)造空的優(yōu)先級隊列
		priority_queue() : c() {}

		template<class Iterator>
		priority_queue(Iterator first, Iterator last)
			: c(first, last)
		{
			// 將c中的元素調整成堆的結構
			int count = c.size();
			int root = ((count - 2) >> 1);
			for (; root >= 0; root--)
				AdjustDown(root);
		}

		void push(const T& data)
		{
			c.push_back(data);
			AdjustUP(c.size() - 1);
		}

		void pop()
		{
			if (empty())
				return;

			swap(c.front(), c.back());
			c.pop_back();
			AdjustDown(0);
		}

		size_t size()const
		{
			return c.size();
		}

		bool empty()const
		{
			return c.empty();
		}

		// 堆頂元素不允許修改,因為:堆頂元素修改可以會破壞堆的特性
		const T& top()const
		{
			return c.front();
		}
        private:
		Container c;
	};

到此這篇關于C++ 容器適配器仿函數(shù)與priority_queue的文章就介紹到這了,更多相關C++ 容器適配器與priority_queue內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • c語言將字符串中的小寫字母轉換成大寫字母

    c語言將字符串中的小寫字母轉換成大寫字母

    本文主要介紹了c語言將字符串中的小寫字母轉換成大寫字母的方法實例。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • C++使用ImGUI框架開發(fā)一個簡單程序

    C++使用ImGUI框架開發(fā)一個簡單程序

    ImGui?是一個用于C++的用戶界面庫,跨平臺、無依賴,支持OpenGL、DirectX等多種渲染API,下面就跟隨小編一起學習一下如何使用ImGUI框架開發(fā)一個簡單程序吧
    2023-08-08
  • opencv實現(xiàn)矩形檢測

    opencv實現(xiàn)矩形檢測

    這篇文章主要為大家詳細介紹了opencv實現(xiàn)矩形檢測,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C++深入講解類與對象之OOP面向對象編程與封裝

    C++深入講解類與對象之OOP面向對象編程與封裝

    學習過C語言的小伙伴知道:C語言是面向過程的,關注的是過程,分析出求解問題的步驟,通過函數(shù)調用逐步解決問題,接下來讓我們詳細的了解
    2022-05-05
  • QT5實現(xiàn)電子時鐘

    QT5實現(xiàn)電子時鐘

    這篇文章主要為大家詳細介紹了QT5實現(xiàn)電子時鐘,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • c++實現(xiàn)MD5算法實現(xiàn)代碼

    c++實現(xiàn)MD5算法實現(xiàn)代碼

    用c++實現(xiàn)了md5算法。包含 md5.h 和md5.cpp 兩個文件。主要參考百度百科 “MD5” 原理,代碼中變量命名也是參考其中的公式,程序的使用說明在md5.h 文件的末尾注釋中
    2013-11-11
  • 基于對話框程序中讓對話框捕獲WM_KEYDOWN消息的實現(xiàn)方法

    基于對話框程序中讓對話框捕獲WM_KEYDOWN消息的實現(xiàn)方法

    下面我們將通過程序給大家演示基于對話框的應用程序對WM_KEYDOWN消息的捕獲。需要的朋友可以參考下
    2013-05-05
  • C語言scandir函數(shù)獲取文件夾內容的實現(xiàn)

    C語言scandir函數(shù)獲取文件夾內容的實現(xiàn)

    scandir?函數(shù)用于列舉指定目錄下的文件列表,本文主要介紹了C語言scandir函數(shù)獲取文件夾內容的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • C語言超詳細講解順序表的各種操作

    C語言超詳細講解順序表的各種操作

    大家好,今天給大家?guī)淼氖琼樞虮?,我覺得順序表還是有比較難理解的地方的,于是我就把這一塊的內容全部整理到了一起,希望能夠給剛剛進行學習數(shù)據(jù)結構的人帶來一些幫助,或者是已經(jīng)學過這塊的朋友們帶來更深的理解,我們現(xiàn)在就開始吧
    2022-05-05
  • C++的輸入與輸出和格式化輸出

    C++的輸入與輸出和格式化輸出

    這篇文章主要介紹了詳解C++中的輸入與輸出和格式化輸出,是C++入門學習中的基礎知識,需要的朋友可以參考,希望能夠給你帶來幫助
    2021-11-11

最新評論