最近在使用stl中的map容器時,碰到key為結構體的情況,總結如下,以便提醒自己。
我的使用情景是,我需要根據不同的比例尺、道路型別這兩個引數獲取到對應的道路寬度,由於我是使用map解決這個問題的,
自然而然的就以比例尺、道路型別這兩個引數為key,道路寬度為value,建立的key如下:
1typedef
struct
tagroadkey 26
}roadkey;
但是編譯的時候,報了這個錯誤
d:\program files\microsoft visual studio\vc98\include\functional(86) : error c2784: 'bool __cdecl std::operator <(const class std::multimap<_k,_ty,_pr,_a> &,const class std::multimap<_k,_ty,_pr,_a> &)' : could not deduce template argument for 'const
class std::multimap<_k,_ty,_pr,_a> &' from 'const struct tagroadkey'
說實話,當初不太明白這是什麼錯誤,但從個人經驗來判斷,問題肯定出在這個key上面,後來google下,看到了別人寫的文章,才知道原因,原來map中的key預設是以less<>公升序對元素排序(排序準則也可以修改),也就是說key必須具備operator《對元素排序,而平常我們的用的基本上都是基本型別元素作為key,所以就不存在這個問題了,更詳細的解釋請看c++標準程式庫一書,第六章,set容器章節。
改正後的結構體如下:
1typedef
struct
tagroadkey 212
else
if(ntype
==other.ntype)
//如果型別相同,按比例尺公升序排序
1316
17return
false;18
}19}roadkey;
完整**如下:1/
/.h///2
#ifndef _croadwidthmng_h_
3#define
_croadwidthmng_h_
4#include
<
map>56
using
namespace
std;78
/*9說明:根據當前比例尺、道路型別獲取對應的道路寬度
10*/
11typedef
struct
tagroadkey
1222
else
if(ntype
==other.ntype)
//如果型別相同,按比例尺公升序排序
2326
27return
false;28
}29}roadkey;
3031
struct
tagroadinfo32;
3637
class
croadwidthmng38;
5556
#endif
5758
////.cpp///
59#include
"croadwidthmng.h"60
61tagroadinfo roadinfoitem =62
,691670
},71,76
1277
},7879,
84685},86,
91392},
93//
/國道///
//94,99
12100
},101
,106
8107
},108
109,
1146
115},
116,
1214
122},
123//
/省道///
//124
,129
10130
},131
,136
10137
},138
139,
1446
145},
146,
1514
152},
153//
/鐵路///
//154
,159
1160
},161
,166
1167
},168
169,
1741
175},
176,
1811
182},
183};
184185
croadwidthmng::croadwidthmng()
186:min_scale(
6), default_road_width(5)
187190
191croadwidthmng::
~croadwidthmng()
192195
196void
croadwidthmng:: init()
197204
}205
206int
croadwidthmng:: getroadwidth(
intnroadtype,
intnscale)
207212
213map
<
roadkey,
int>
::iterator itor;
214215
intnvalue;
216roadkey roadkey;
217roadkey.ntype
=nroadtype;
218roadkey.nscale
=nscale;
219220
itor
=m_roadmap.find(roadkey);
221222
if(itor
!=m_roadmap.end())
223226
else
227230
231return
nvalue;
232}
c map中key為結構體
專案中需要將結構體作為hash的key,一開始用hash map,但是結構體中多值比較一直失敗,所以嘗試了map。hash map 查詢速度會比map快,而且查詢速度基本和資料量大小無關,屬於常數級別 而map的查詢速度是log n 級別。hash還有hash函式的耗時。當有100w條記錄的時候,m...
c map 結構體作為key關鍵詞
結構體的定義 這裡的結構體是三個值 int x int y int label 當三個值作為 值時,你需要重新定義它的對比操作operator,這樣才能對map進行查詢操作 資料結構宣告 並且對key的查詢操作進行定義,這樣才能進行find等操作 struct point friend bool o...
在C 中結構體為函式引數的例子
將乙個結構體變數中的資料傳遞給另乙個函式,有下列3種方法 1.用結構體變數名作引數。一般較少用這種方法。2.用指向結構體變數的指標作實參,將結構體變數的位址傳給形參。3.用結構體變數的引用變數作函式引數。下面通過乙個簡單的例子來說明,並對它們進行比較。例7.5 有乙個結構體變數stu,內含學生學號 ...