基于C++ map中key使用指針問(wèn)題的詳解
C++實(shí)際開(kāi)發(fā)的過(guò)程會(huì)經(jīng)常使用到map。map是一個(gè)key-value值對(duì),key唯一,可以用find進(jìn)行快速的查找。其時(shí)間復(fù)雜度為O(logN),如果采用for循環(huán)進(jìn)行遍歷數(shù)據(jù)時(shí)間復(fù)雜度為O(N)。如果map中的數(shù)據(jù)量比較少時(shí),采用find和for循環(huán)遍歷的效率基本沒(méi)有太大的區(qū)別,但是在實(shí)際的開(kāi)發(fā)過(guò)程中,存儲(chǔ)在map中的數(shù)據(jù)往往是大量的,這個(gè)時(shí)候map采用find方式效率比遍歷效率高的多。
確定采用find方式查找數(shù)據(jù)后,我們需要考慮存儲(chǔ)map的空間復(fù)雜度,對(duì)于基礎(chǔ)數(shù)據(jù)類型的數(shù)據(jù)(int char等)這里就不做討論。本文討論的是map中存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)struct情況。
1、如果map中的key為struct此時(shí),需要先對(duì)struct進(jìn)行操作符重載,關(guān)于這部分內(nèi)容可以參考C++ 重載操作符示例
2、map中的key只能是對(duì)象,而不能是指針。(這一點(diǎn)尤為重要)。
下面給出三個(gè)map定義進(jìn)行說(shuō)明:
std::map<NHSymbolkey, Stru_NHSymbol>* pmapNHSymbolInfo1
std::map<NHSymbolkey, Stru_NHSymbol*>* pmapNHSymbolInfo2
std::map<NHSymbolkey*, Stru_NHSymbol*>* pmapNHSymbolInfo2
其中,pmapNHSymbolInfo1、pmapNHSymbolInfo2中使用find正常,遍歷也正常,pmapNHSymbolInfo3使用find查找不到對(duì)應(yīng)的數(shù)據(jù)(數(shù)據(jù)已經(jīng)存在,find不到,遍歷可以找到)
原因:std::map<NHSymbolkey*, Stru_NHSymbol*>* pmapNHSymbolInfo2在find的時(shí)候是根據(jù)指針進(jìn)行查找的。而在數(shù)據(jù)insert時(shí),數(shù)據(jù)都是new的,每次new出的地址是不一樣的,在find數(shù)據(jù)時(shí),根據(jù)地址查找結(jié)果就找不到數(shù)據(jù)。通過(guò)遍歷是取出地址中內(nèi)容一一比較,這樣能夠找到數(shù)據(jù)。
pmapNHSymbolInfo1、pmapNHSymbolInfo2兩種方式都可以使用find方式查找數(shù)據(jù),但是pmapNHSymbolInfo1中Stru_NHSymbol為對(duì)象,這樣會(huì)使map占用空間比較大,pmapNHSymbolInfo2的Stru_NHSymbol為指針,存儲(chǔ)時(shí)地址占用空間小,但是每次都是new處理來(lái)的,所有一定要記住使用完成后一定要delete,否則會(huì)出現(xiàn)內(nèi)存泄露。
3、map插入數(shù)據(jù)2中方式比較
std::map<NHSymbolkey, Stru_NHSymbol*>* pmapNHSymbolInfo
pmapNHSymbolInfo->insert(std::make_pair(pNHSymbolkey, pNHSymbol));該方式的key如果出現(xiàn)重復(fù),則會(huì)插入數(shù)據(jù)失??;
(*pmapNHSymbolInfo)[objNHSymbolkey] = pNHSymbol;該方式的key如果出現(xiàn)重復(fù)則直接覆蓋掉原來(lái)的數(shù)據(jù),永遠(yuǎn)不會(huì)出現(xiàn)插入失敗的問(wèn)題。
結(jié)論:C++ map中key不要使用指針,請(qǐng)直接使用對(duì)象。
相關(guān)文章
深入解析C++的WNDCLASS結(jié)構(gòu)體及其在Windows中的應(yīng)用
這篇文章主要介紹了C++的WNDCLASS結(jié)構(gòu)體及其在Windows中的應(yīng)用,WNDCLASS被用來(lái)定義窗口,文中介紹了其諸多屬性,需要的朋友可以參考下2016-01-01一篇文章徹底弄懂C++虛函數(shù)的實(shí)現(xiàn)機(jī)制
C++中的虛函數(shù)的作用主要是實(shí)現(xiàn)了多態(tài)的機(jī)制,基類定義虛函數(shù),子類可以重寫(xiě)該函數(shù),在派生類中對(duì)基類定義的虛函數(shù)進(jìn)行重寫(xiě)時(shí),需要在派生類中聲明該方法為虛方法,這篇文章主要給大家介紹了關(guān)于如何通過(guò)一篇文章徹底弄懂C++虛函數(shù)的實(shí)現(xiàn)機(jī)制,需要的朋友可以參考下2021-06-06C++實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)的順序表詳解
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)動(dòng)態(tài)順序表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11C++面試八股文之如何實(shí)現(xiàn)strncpy函數(shù)
strncpy函數(shù),主要用做字符串復(fù)制,將于字符從一個(gè)位置復(fù)制到另一個(gè)位置,那么如何實(shí)現(xiàn)一個(gè)strncpy函數(shù),下面小編就來(lái)和大家簡(jiǎn)單講講吧2023-07-07C++ LeetCode1796字符串中第二大數(shù)字
這篇文章主要為大家介紹了C++ LeetCode1796字符串中第二大數(shù)字示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12c語(yǔ)言枚舉類型enum的用法及應(yīng)用實(shí)例
enum是C語(yǔ)言中的一個(gè)關(guān)鍵字,enum叫枚舉數(shù)據(jù)類型,枚舉數(shù)據(jù)類型描述的是一組整型值的集合,這篇文章主要給大家介紹了關(guān)于c語(yǔ)言枚舉類型enum用法及應(yīng)用的相關(guān)資料,需要的朋友可以參考下2021-07-07C++實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07