欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于C++ map中key使用指針問題的詳解

 更新時間:2013年05月16日 10:28:40   作者:  
本篇文章是對C++ map中key使用指針的問題進行了詳細的分析介紹,需要的朋友參考下

C++實際開發(fā)的過程會經常使用到map。map是一個key-value值對,key唯一,可以用find進行快速的查找。其時間復雜度為O(logN),如果采用for循環(huán)進行遍歷數據時間復雜度為O(N)。如果map中的數據量比較少時,采用find和for循環(huán)遍歷的效率基本沒有太大的區(qū)別,但是在實際的開發(fā)過程中,存儲在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不要使用指針,請直接使用對象。

相關文章

  • 老程序員教你一天時間完成C++俄羅斯方塊游戲

    老程序員教你一天時間完成C++俄羅斯方塊游戲

    俄羅斯方塊游戲大家應該非常熟悉,非常經典的一款游戲,本文來詳細講解下俄羅斯方塊游戲的制作過程,趕緊來看下吧!希望能給你帶來幫助
    2021-08-08
  • 深入解析C++的WNDCLASS結構體及其在Windows中的應用

    深入解析C++的WNDCLASS結構體及其在Windows中的應用

    這篇文章主要介紹了C++的WNDCLASS結構體及其在Windows中的應用,WNDCLASS被用來定義窗口,文中介紹了其諸多屬性,需要的朋友可以參考下
    2016-01-01
  • 一篇文章徹底弄懂C++虛函數的實現機制

    一篇文章徹底弄懂C++虛函數的實現機制

    C++中的虛函數的作用主要是實現了多態(tài)的機制,基類定義虛函數,子類可以重寫該函數,在派生類中對基類定義的虛函數進行重寫時,需要在派生類中聲明該方法為虛方法,這篇文章主要給大家介紹了關于如何通過一篇文章徹底弄懂C++虛函數的實現機制,需要的朋友可以參考下
    2021-06-06
  • C++實現數據結構的順序表詳解

    C++實現數據結構的順序表詳解

    這篇文章主要為大家詳細介紹了C++實現動態(tài)順序表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • c語言多進程tcp服務器示例

    c語言多進程tcp服務器示例

    這篇文章主要介紹了c語言多進程tcp服務器示例,多進程socket,epoll實現IO復用,需要的朋友可以參考下
    2014-03-03
  • C++面試八股文之如何實現strncpy函數

    C++面試八股文之如何實現strncpy函數

    strncpy函數,主要用做字符串復制,將于字符從一個位置復制到另一個位置,那么如何實現一個strncpy函數,下面小編就來和大家簡單講講吧
    2023-07-07
  • C++ LeetCode1796字符串中第二大數字

    C++ LeetCode1796字符串中第二大數字

    這篇文章主要為大家介紹了C++ LeetCode1796字符串中第二大數字示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • C++ pair方法與vector方法案例詳解

    C++ pair方法與vector方法案例詳解

    這篇文章主要介紹了C++ pair方法與vector方法案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-09-09
  • c語言枚舉類型enum的用法及應用實例

    c語言枚舉類型enum的用法及應用實例

    enum是C語言中的一個關鍵字,enum叫枚舉數據類型,枚舉數據類型描述的是一組整型值的集合,這篇文章主要給大家介紹了關于c語言枚舉類型enum用法及應用的相關資料,需要的朋友可以參考下
    2021-07-07
  • C++實現學生管理系統

    C++實現學生管理系統

    這篇文章主要為大家詳細介紹了C++實現學生管理系統,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07

最新評論