在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有網格效果
關於sort中cmp一個小問題
如果想用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 'pthread_create@@GLIBC_2.2.5'
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