STL map中key為結構體的用法

2021-06-29 00:33:35 字數 3134 閱讀 7022

最近在使用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,內含學生學號 ...