map key char*
STL中map的key能否用char 呢?當然可以!
在程序中需要用到一個map,本來是這樣寫的,
map<string, int> mapStr;
為了追求效率,把string改成了char ,
map<char , int> mapStr;
結果呢?
可想而知,每次放進去的是指針,
當查找的時候就出問題了,總是找不到。
因為key中存放的是指針,當然找不到了。
需要重載一下操作符,當查找時比較指針對應的字符串就可以了。
修改如下:
struct ptrCmp
{
bool operator()( const char s1, const char * s2 ) const
{
return strcmp( s1, s2 ) < 0;
}
};
map<char , int, ptrCmp> mapStr;
再進行查找就OK了!
===========================
C++ map中key使用指針的問題 (2012-12-07 08:19:28) 轉載▼
標簽: map find失敗 find不到結果 分類: 調試
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如果出現重復則直接覆蓋掉原來的數據,永遠不會出現插入失敗的問題。
轉載于:https://www.cnblogs.com/Corphish/articles/7409786.html
總結
以上是生活随笔為你收集整理的map key char*的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面向对象(特点)、局部变量与全局变量的区
- 下一篇: 保留小数点后两位小数