基於C++ map中key使用指標問題的詳解

來源:互聯網
上載者:User

C++實際開發的過程會經常使用到map。map是一個key-value值對,key唯一,可以用find進行快速的尋找。其時間複雜度為O(logN),如果採用for迴圈進行遍曆資料時間複雜度為O(N)。如果map中的資料量比較少時,採用find和for迴圈遍曆的效率基本沒有太大的區別,但是在實際的開發過程中,儲存在map中的資料往往是大量的,這個時候map採用find方式效率比遍曆效率高的多。

確定採用find方式尋找資料後,我們需要考慮儲存map的空間複雜度,對於基礎資料類型的資料(int char等)這裡就不做討論。本文討論的是map中儲存的資料結構struct情況。
1、如果map中的key為struct此時,需要先對struct進行操作符重載,關於這部分內容可以參考C++ 重載操作符樣本
2、map中的key只能是對象,而不能是指標。(這一點尤為重要)。

下面給出三個map定義進行說明:

std::map<NHSymbolkey, Stru_NHSymbol>* pmapNHSymbolInfo1
std::map<NHSymbolkey, Stru_NHSymbol*>* pmapNHSymbolInfo2
std::map<NHSymbolkey*, Stru_NHSymbol*>* pmapNHSymbolInfo2

其中,pmapNHSymbolInfo1、pmapNHSymbolInfo2中使用find正常,遍曆也正常,pmapNHSymbolInfo3使用find尋找不到對應的資料(資料已經存在,find不到,遍曆可以找到)

原因:std::map<NHSymbolkey*, Stru_NHSymbol*>* pmapNHSymbolInfo2在find的時候是根據指標進行尋找的。而在資料insert時,資料都是new的,每次new出的地址是不一樣的,在find資料時,根據地址尋找結果就找不到資料。通過遍曆是取出地址中內容一一比較,這樣能夠找到資料。

pmapNHSymbolInfo1、pmapNHSymbolInfo2兩種方式都可以使用find方式尋找資料,但是pmapNHSymbolInfo1中Stru_NHSymbol為對象,這樣會使map佔用空間比較大,pmapNHSymbolInfo2的Stru_NHSymbol為指標,儲存時地址佔用空間小,但是每次都是new處理來的,所有一定要記住使用完成後一定要delete,否則會出現記憶體泄露。

3、map插入資料2中方式比較
std::map<NHSymbolkey, Stru_NHSymbol*>* pmapNHSymbolInfo
pmapNHSymbolInfo->insert(std::make_pair(pNHSymbolkey, pNHSymbol));該方式的key如果出現重複,則會插入資料失敗;

(*pmapNHSymbolInfo)[objNHSymbolkey] = pNHSymbol;該方式的key如果出現重複則直接覆蓋掉原來的資料,永遠不會出現插入失敗的問題。
結論:C++ map中key不要使用指標,請直接使用對象。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.