最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

容器適配器

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

仿函數(shù)

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

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

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

示例:

#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ù)進(jìn)行排序
    std::sort(numbers.begin(), numbers.end(), Compare());
 
    std::cout << "Sorted numbers: ";
    for (int num : numbers) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
 
    return 0;
}

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

priority_queue

priority_queue簡單介紹

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

模擬實(shí)現(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;
		}
	};

首先實(shí)現(xiàn)兩個(gè)仿函數(shù)可以用來建立大(小)堆

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

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

		// 向下調(diào)整
		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;
			}
		}

向上(向下)調(diào)整算法

向上調(diào)整算法:從最后一個(gè)節(jié)點(diǎn)開始與自己的父親比較,如果比父親大(小)就和父親交換位置,直到調(diào)整到根節(jié)點(diǎn)為止

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

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

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

		template<class Iterator>
		priority_queue(Iterator first, Iterator last)
			: c(first, last)
		{
			// 將c中的元素調(diào)整成堆的結(jié)構(gòu)
			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();
		}

		// 堆頂元素不允許修改,因?yàn)椋憾秧斣匦薷目梢詴茐亩训奶匦?
		const T& top()const
		{
			return c.front();
		}
        private:
		Container c;
	};

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

相關(guān)文章

  • C++ boost scoped_ptr智能指針詳解

    C++ boost scoped_ptr智能指針詳解

    智能指針是一種像指針的C++對象,但它能夠在對象不使用的時(shí)候自己銷毀掉。雖然STL提供了auto_ptr,但是由于不能同容器一起使用(不支持拷貝和賦值操作),因此很少有人使用。它是Boost各組件中,應(yīng)用最為廣泛的一個(gè)
    2022-11-11
  • C++線性時(shí)間的排序算法分析

    C++線性時(shí)間的排序算法分析

    這篇文章主要介紹了C++線性時(shí)間的排序算法分析,是非常經(jīng)典的非比較排序算法,對于C++程序員有很大的借鑒價(jià)值,需要的朋友可以參考下
    2014-08-08
  • C語言動(dòng)態(tài)內(nèi)存的分配實(shí)例詳解

    C語言動(dòng)態(tài)內(nèi)存的分配實(shí)例詳解

    動(dòng)態(tài)內(nèi)存管理同時(shí)還具有一個(gè)優(yōu)點(diǎn),當(dāng)程序在具有更多內(nèi)存的系統(tǒng)上需要處理更多數(shù)據(jù)時(shí),不需要重寫程序,下面這篇文章主要給大家介紹了關(guān)于C語言動(dòng)態(tài)內(nèi)存分配的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • C++中箭頭運(yùn)算符的含義與用法講解

    C++中箭頭運(yùn)算符的含義與用法講解

    今天小編就為大家分享一篇關(guān)于C++中箭頭運(yùn)算符的含義與用法講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • C++ main函數(shù)中的argc與argv全面解析

    C++ main函數(shù)中的argc與argv全面解析

    C/C++中的main函數(shù)可以接受命令行參數(shù),通過argc和argv來傳遞這些參數(shù),argc表示參數(shù)總數(shù),argv是一個(gè)字符串?dāng)?shù)組,包含具體的參數(shù),本文介紹C++ main函數(shù)中的argc與argv,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • C++中map和vector作形參時(shí)如何給定默認(rèn)參數(shù)?

    C++中map和vector作形參時(shí)如何給定默認(rèn)參數(shù)?

    今天小編就為大家分享一篇關(guān)于C++中map和vector作形參時(shí)如何給定默認(rèn)參數(shù)?,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Qt 事件過濾器的具體實(shí)現(xiàn)

    Qt 事件過濾器的具體實(shí)現(xiàn)

    事件過濾器,見名之意,就是將事件過濾一遍,將不需要的事件都清除掉,剩下需要的事件進(jìn)行操作。本文詳細(xì)的介紹了Qt 事件過濾器的具體實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C++讀寫word文檔(.docx)DuckX庫的使用詳解

    C++讀寫word文檔(.docx)DuckX庫的使用詳解

    DuckX是C++庫,用于創(chuàng)建/編輯.docx文件,支持讀取文檔、添加段落/片段、編輯表格,解決中文亂碼需更改編碼方案,進(jìn)階功能含文本替換(支持表格)和文檔合并(僅限文本)
    2025-09-09
  • C++使用FFmpeg實(shí)現(xiàn)YUV數(shù)據(jù)編碼轉(zhuǎn)視頻文件

    C++使用FFmpeg實(shí)現(xiàn)YUV數(shù)據(jù)編碼轉(zhuǎn)視頻文件

    這篇文章主要介紹了C++如何使用FFmpeg實(shí)現(xiàn)把一個(gè)YUV原始視頻數(shù)據(jù)(時(shí)間序列圖像)經(jīng)過h264編碼為視頻碼流,然后在使用mp4封裝格式封裝,感興趣的可以了解一下
    2023-06-06
  • C語言深入分析浮點(diǎn)型數(shù)據(jù)存儲

    C語言深入分析浮點(diǎn)型數(shù)據(jù)存儲

    使用編程語言進(jìn)行編程時(shí),需要用到各種變量來存儲各種信息。變量保留的是它所存儲的值的內(nèi)存位置。這意味著,當(dāng)您創(chuàng)建一個(gè)變量時(shí),就會在內(nèi)存中保留一些空間。您可能需要存儲各種數(shù)據(jù)類型的信息,操作系統(tǒng)會根據(jù)變量的數(shù)據(jù)類型,來分配內(nèi)存和決定在保留內(nèi)存中存儲什么
    2022-08-08

最新評論

金华市| 伊金霍洛旗| 博罗县| 新巴尔虎右旗| 达孜县| 于都县| 封丘县| 桃园县| 奉化市| 临海市| 思茅市| 米林县| 凯里市| 化隆| 廊坊市| 丰都县| 松阳县| 望城县| 南丹县| 禹城市| 永福县| 团风县| 梓潼县| 个旧市| 深水埗区| 航空| 拉萨市| 三明市| 奉贤区| 沽源县| 鄂尔多斯市| 武陟县| 张掖市| 枝江市| 通化市| 呼图壁县| 临猗县| 衡阳县| 磴口县| 将乐县| 五华县|