1. 程式人生 > >map與unordered_map的區別

map與unordered_map的區別

內部的原理實現:

map:【標頭檔案為#include<map>】map內部是一顆紅黑樹(非嚴格平衡二叉樹),紅黑樹有自動排序的功能,所以map內部的所有元素都是有序的,紅黑樹的每一個節點都代表這map的一個元素。因此對map進行插入、刪除、查詢等操作都是相當於對紅黑樹進行操作。最後根據樹的中序遍歷可以將鍵值按照大小順序遍歷出來。

unordered_map:【標頭檔案#include<unordered_map>】unordered_map內部是一個雜湊表(散列表,把關健值對映到雜湊表中的某一個位置,這樣查詢時間複雜度是O(1)),元素的排列順序是無序的。

優缺點:

map:

      1、優點:

           (1)有序性:map結構的紅黑樹自身是有序的,但是要中序遍歷輸出

           (2)時間複雜度低:內部結構時紅黑樹,紅黑樹很多操作都是在logn的時間複雜度下實現的,因此效率高。

      2、缺點:

            空間佔有率高,因為map內部實現是紅黑樹,雖然它時間複雜度低,執行效率高,但是因為每一個節點都需要額外儲存父  節點、孩子節點和紅黑樹性質,這樣使得每一個節點都佔用大量的空間。

      3、應用場景:

            應用於對順序有要求的問題,用map會更高效。

unordered_map:

     1、優點:內部結構是雜湊表,查詢為O(1),效率高。

     2、缺點:雜湊表的建立耗費時間。

     3、應用場景:  對於頻繁查詢的問題,用unordered_map更高效。

總結:

      1、記憶體佔用率問題轉化為 紅黑樹 VS 雜湊表,還是unordered_map記憶體佔用高

      2、但是unordered_map執行效率高。

      3、對於unordered_map或unordered_set容器,其遍歷順序與建立該容器時輸入的順序不一定相同,因為遍歷是按照雜湊表從前往後依次遍歷的。

map和unordered_map的使用

unordered_map與map用法一致,裡面的元素以pair型別儲存。雖然底層實現完全不同,但是外部使用一致。

map:

int main()
{
	map<int,string> mymap;
	mymap.insert(pair<int,string>(5,"孫"));
	mymap.insert(pair<int,string>(2,"安"));
	mymap.insert(pair<int,string>(3,"施"));
	mymap.insert(pair<int,string>(3,"楊"));//key值唯一,相同的key插不進去

	auto iter = mymap.begin();
	while(iter != mymap.end())
	{
		cout<<iter->first<<","<<iter->second<<endl;
		++iter;
	}

	auto iter2 = mymap.find(2);//返回一個指向key = 1的迭代器
	if(iter2 != mymap.end())
	{
		cout<<"true"<<endl;
		cout<<iter2->first<<","<<iter2->second<<endl;
	}
}

執行結果:無論怎麼插進去資料,都會按照key的大小順序排列,注意:key值唯一,兩個一樣的key插入時,第二條資料插不進去。

unordered_map:

int main()
{
	unordered_map<int,string> mymap;
	mymap.insert(pair<int,string>(5,"孫"));
	mymap.insert(pair<int,string>(2,"安"));
	mymap.insert(pair<int,string>(3,"施"));
	mymap.insert(pair<int,string>(3,"楊"));//key值唯一,相同的key插不進去

	auto iter = mymap.begin();
	while(iter != mymap.end())
	{
		cout<<iter->first<<","<<iter->second<<endl;
		++iter;
	}

	auto iter2 = mymap.find(2);//返回一個指向key = 1的迭代器
	if(iter2 != mymap.end())
	{
		cout<<"true"<<endl;
		cout<<iter2->first<<","<<iter2->second<<endl;
	}
}

執行結果:以怎樣的順序插進unordered_map表,以怎樣的順序打印出來,不會進行自動排序,注意:key值唯一,兩個一樣的key插入時,第二條資料插不進去。

count方法與find方法的區別

mymap.count(key):計算的是下標為key的位置有無資料,有返回1,無返回0

mymap.find(key):得到的物件時一個迭代器,需要對迭代器進行判斷是否是mymap.end(),如果是則無資料,如果不是則有資料

 

 

參考:https://blog.csdn.net/zjajgyy/article/details/65935473