1. 程式人生 > >在vs中使用hash_map的一個小總結

在vs中使用hash_map的一個小總結

一直以來都不是太習慣使用hash_map

在專案中首次使用,本來以為可以像使用vector的遍歷操作來呼叫的,但是……

hash_map的原理是使用一個hash函式,來儲存key和value

原來在vs中的hash_map已經被unordered_map取代了

這是一個對unordered_map的使用和說明:

一段引用別人blog的一段話:

hash_map這個東西,好好理解一下就明白,通過hash把key分佈在一個大的空間內。空間內的key分散式相當離散的,要再上面做遍歷操作肯定得遍歷各個hash bucket(當然,你自己維護一個連結串列除外),使用遍歷器的代價是十分高昂的,而這個begin()也不例外!程式碼裡頭也確實這麼寫的(/usr/include/c++/4.1.1/ext/hashtable.h):
      iterator
      begin()
      {
    for (size_type __n = 0; __n < _M_buckets.size(); ++__n)
      if (_M_buckets[__n])
        return iterator(_M_buckets[__n], this);
    return end();
      }
所以,使用hash_map的時候一定要儘量避開iterator。


可以看出來我也進入了一個誤區,用了iterator,也可能我對find不熟引起的,可以看下面的一段測試程式碼:

#include "stdafx.h"
#include "iostream"
#include "fstream"
#include "string"
#include "sstream"
using namespace std;
#include "unordered_map"
#include "time.h"


#define  BEGINE_GET_TIME clock_t start_time = clock();
#define  ENG_GET_TIME    clock_t end_time = clock();

#define  CONSOLE_TIME    cout << "Running time is: " << static_cast<double>(end_time - start_time) / CLOCKS_PER_SEC * 1000 << "ms" << endl; //輸出執行時間


int _tmain(int argc, _TCHAR* argv[])
{
	unordered_map<string, string> test;
	stringstream ss;
	string tmp_key;
	string tmp_value;
	for (int index = 0; index < 10001; index++)
	{
		ss << "zeng"; ss << index;
		ss >> tmp_key;
		ss.clear();
		ss << "zengraoli"; ss << index;
		ss >> tmp_value;
		ss.clear();
		test.insert(pair<string, string>(tmp_key, tmp_value));
		ss.str("");
	}

// 	BEGINE_GET_TIME;
// 	// 先來看看遍歷的速度
// 	for (int count = 0; count < 10000; count++)
// 	{
// 	 	unordered_map<string, string>::iterator it;
// 	 	for (it = test.begin(); it != test.end(); it++)
// 	 	{
// 	 		if (it->first == "zeng10000")
// 	 		{
// 	 			if (it->second == "zengraoli10000")
// 	 			{
// 	 		//		cout << "find" << endl;
// 	 			}
// 	 		}
// 	 	}
// 	}
// 	ENG_GET_TIME;
// 	CONSOLE_TIME;



	BEGINE_GET_TIME;
	// 對比下使用find的情況
	for (int count = 0; count < 10000; count++)
	{
		unordered_map<string, string>::iterator it;
		it = test.find("zeng10000");
		if (it == test.end())
		{
			cout << "not find" << endl;
		}
		else
		{
			if (it->second == "zengraoli10000")
			{
				//	cout << "find" << endl;
			}
		}
	}
	ENG_GET_TIME;
	CONSOLE_TIME;


	return 0;
}


第一個使用迭代器的消耗時間是:


第二個使用find消耗的時間是:


可以看出來,資料量一大的情況小,find更加節省時間

相關推薦

vs使用hash_map一個總結

一直以來都不是太習慣使用hash_map 在專案中首次使用,本來以為可以像使用vector的遍歷操作來呼叫的,但是…… hash_map的原理是使用一個hash函式,來儲存key和value 原來在vs中的hash_map已經被unordered_map取代了 這是一

一個總結吧,把別人的經驗拿來總結一下

spa range 簡單的 pan att 切片 XML append filter 構造一個1, 3, 5, 7, ..., 99的列表,可以通過循環實現: 取list的前一半的元素,也可以通過循環實現: 1. L = [] n = 1 while n <= 9

zabbix安裝一個錯誤

端口 tail Oz shadow 9.png pro app 數據庫 HA 今天安裝了下zabbix3.4,前面一直安裝比較順利,然而web登陸後發現出現了小錯誤,我的zabbix服務端10051端口無法監聽,我重啟了幾次服務端,然而還是報這錯誤。。 排查了半天也沒發現

mybatis一個異常org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to

1.錯誤描述 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or

awk分隔符一個妙用

處理文字的時候如果碰到,諸如"123abc,45^&dfgh67ab|&8"這種以所有非數字的來隔開數字的字串,要得出數字字串的個數。 其中連續的數字,比如123算一個。這個時候可以藉助awk中的-F分隔符來處理,可以起到妙用的效果! [[email prote

asp.net core 2.0一個問題

mva中觀看asp.net core初級視訊,CURD一節中跟著視訊把程式碼敲上去了,發現無法正常執行,提示是NullReferenceException。打了幾個斷點,發現數據已經順利的存入了記憶體資料庫中,不過在Razor模板頁面獲取資料的時候,沒有正確的返回要獲得的資料

stm32串列埠通訊的一個總結(從底層進行理解)

從底層理解stm32USART串列埠通訊 以前學串列埠通訊踩過很多坑,過了一段時間又有些忘了,現在問了幾個很強很強的人差不多弄懂了,現在寫一寫總結,免得以後又忘了。 基本知識: 1、TDR和RDR都是USART_DR暫存器的緩衝區,指的是USART_DR的0到8位,TD

Shell的tr命令加密解密一個應用

tr命令可以來刪除或替換,這個可能大家都非常熟悉。比如 [[email protected] ~]# echo "The Number:12345" | tr -cd '[0-9]' # 僅保留數字 12345 [[email protected] ~]# echo "

Android開發一個功能 清空搜尋框的文字

需求:專案中的有關搜尋的地方,加上清空文字的功能,目的是為了增加使用者體驗,使使用者刪除文字更加快捷 解決過程:開始的時候感覺這個東西不太好實現,主要就是佈局的問題,可能是開始顧慮的太多了,再加上當時產品催的不太緊,而且這個功能也不是必須實現的。但是今天不一樣了,這個是老大

org.springframework.orm.hibernate3.HibernateQueryException一個異常

在使用Hibernate的時候,出現了這樣的一個錯誤: org.springframework.orm.hibernate3.HibernateQueryException: Position beyond number of declared ordinal parameters. Re

caffe data_transformer.cpp 函式一個問題

在訓練情況下,測試的時候,因為phase變數沒有及時更新。 導致在test的情況下出錯。。。 直接更新下  this->phase_ = Caffe::phase();就好了。 //  LOG(INFO) << "MODEL:" << Caf

swift 開發過程的一些總結

import FoundationextensionString {var md5 : String{let str = self.cString(using:String.Encoding.utf8)let strLen = CC_LONG(self.lengthOfBytes(using:Str

如何寫日曆一個方塊

public class PaintView extends View { private static final String TAG = "CalendarView"; /** * 預設cell上下左右間距:4px,使繪製的View有網格效果

關於sortcmp一個問題

如果想用cmp進行從大到小的排序用下列的程式碼時,bool cmp(int a, int b){if(a != b) return a > b;}用PAT判斷時 可能會出現段錯誤;例A1037.正確的寫法應該是bool cmp(int a, int b){return

關於Java Primitive型別與內建Wrapper型別使用過程的一點總結

最近在寫程式碼時由於對於Permitive型別和內建Wrapper型別使用不當,導致除錯程式除錯過程中出現了許多問題,在這裡簡單總結一下。 1.傳參 Permitive作形參時,若函式呼叫時使用Wrapper型別作實參,需要保證實參被初始化不為null。 /** * Cr

解決時間外掛mobiscroll在使用過程一個缺陷

最近在寫一個web專案時,需要有一個根據年份查詢當年入職人員資料的功能,於是我選擇了mobiscroll這個外掛做了時間滾輪。一開始感覺效果不錯,但是在測試的時候發現了一個小bug。 因為在同一個頁面中使用者也可以通過查詢id將入職時間查出,所以當時就直接把通

salesforce零基礎學習(七十二)項目的零碎知識點總結(一)

gin 不同 grant dmi ima -m ron 角色 com 項目終於告一段落,雖然比較苦逼,不過也學到了好多知識,總結一下,以後當作參考。 一.visualforce標簽中使用html相關的屬性使用 曾經看文檔沒有看得仔細,導致開發的時候走了一些彎路。還好得到

linux下開發,解決cocos2d-x編譯出現的一個問題, undefined reference to symbol &#39;pthread_create@@GLIBC_2.2.5&#39;

water span x86 code bject data- ace 技術分享 inux 解決cocos2d-x中編譯出現的一個小問題 對於cocos2d-x 2.×中編譯中,若頭文件裏引入了#include "cocos-ext.h",在進行C++編譯的時候會遇到例

php引用&的一個實例

應該 數量 保存 cnblogs 理解 循環 簡單的 執行 次循環 在百度知道上碰到一段關於php的引用符&的代碼,對於初學都來說還是很考驗理解分析能力的,把代碼和自己的分析貼上來作一個備份,也與大家共勉。 代碼片段: 1 $arr =array(1,2,3

BeX5開發MySQL視圖使用的一個問題

bex5開發中mysql視圖使用的一個小問題問題 數據操作中的查詢是極端重要的,使用頻繁。MySQL數據庫中視圖概念的存在十分類似於微軟Access小型關系數據庫中的查詢(二級考試重點)。視圖的存在極大減小了數據表的創建數量,而且還有更為高級的運用技巧。本文介紹在基於起步科技的BeX5平臺上使用MySQ