標籤:

vector<int>(128,0) 代替 unordered_map<char, int>靠譜嗎?

在leetcode刷題時候,看見有答案使用vector& map(128,0) 代替 unordered_map& map的功能, 這種做法我應該學習嗎?

並不了解哈希函數的具體實現,vector&實際運行會快一點。。。但是這個技巧值得學習嗎? 看起來很不安全。。。。


當然可以。反正這是C++,安全性語言永遠不管的,都看你。

我在正則表達式的實現裡面,就是四層16叉樹來做字元串的map的,跟這個原理上一致。


這是很正常的操作啊,空間換時間,map變查表。

不過128的確稍有問題,我的話還是會開256的大小(反正用不上的不會拖累速度,這麼小都在L1里)。但恕我直言,128/256個key,實在沒什麼必要用hashmap吧……又不是multimap。

而且顯然也沒必要用vector,用array才夠C++11啊……

如果這裡的char是指代一個字元的話,我覺得也就在刷題的時候這麼寫寫了,現實中難免要考慮unicode……


是安全的,可列印字元一般都在0 ~ 127的範圍內,所以用vector& map(128,0)是可以存儲的,不會越界


int a[128]豈不是更好。


leetcode刷題是為了找工作,但面試現場寫白板的時候考官是不會細究這些東西的,而且面試會有討論過程,考官如果在意你可以直接陳述選unordered_map好還是vector比較好。

可能你用unordered_map別人還覺得你不用magic number,容錯率高,代碼風格比較好呢。反過來說你現場用std::vector&也沒什麼關係。你還不是他們公司的員工,代碼風格再差也不過是幾個小時看一遍guideline就能解決的,而且vector效率確實高些。實際上很多情況下,如果到處用map,那效率肯定很差。所以脫離工程實際討論這些trade off就顯得有些可笑。

不過題主最好去了解下std::hash對char/int/string的實現,還有unordered_map內存組織的方法。比你糾結vector還是map要有效的多。


這些都是刷題產生的技巧,刷題當然沒問題。現實中我是很少遇到這樣的場景。


template &

using flat_map& = vector&;

(霧 這樣名字就好聽了


很安全,沒毛病,工程里這麼用也不會有什麼穩定性相關的問題,就是得寫好注釋給別人看明白。直接拿值當成下邊來用也是哈希呀(捂臉)。

技巧學一下可以但是不要濫用。比如說一些對內存需求高的場合,或者是鍵名太長就不要這麼幹了,比如說兩個char的時候。。。


刷題當然可以了,又寫不出什麼安全性問題,這樣的投機方法說不定面試還能吹一波constant space complexity


推薦閱讀:

TAG:CC | LeetCode領扣 |