2011-04-20 72 views
0

我在混合C/C++環境中編碼。我在C部分有一個結構,我想在C++部分的地圖容器中收集它。 我想我應該定義一個自定義的key_compare函數對象,並讓STL map :: insert()命令節點。不過我不知道如何修改map容器來自定義map :: find()函數。我正在尋找一種方法來自定義map :: find()函數來執行更多的key_compare函數進行等價檢查。在ANSI C中定義的結構的STL映射C

請你讓我知道如何將這些函數放入STL :: map或STL :: set?

這裏是我的C部分,結構(用gcc編譯):

typedef struct iotrace_arh_node 
{ 
    double time; 
    unsigned long long int blkno; 
    int bcount; 
    u_int flags; 
    int devno; 
    unsigned long stack_no; 
} iotrace_arh_node_t; 

這裏是我的建議key_compare和C++部分等效性檢查功能find()方法(編譯使用g ++) :

int key_compare (struct iotrace_arh_node tempa, struct iotrace_arh_node tempb) 
{ 
return (tempa.blkno-tempb.blkno); 
} 


int key_equal(struct iotrace_arh_node tempa, struct iotrace_arh_node tempb) 
{ 
    if((tempa.blkno == tempb.blkno) && (tempa.bcount == tempb.bcount)) 
     return 0; // tempa and tempb is equal, node fund in the map 
    else if ((tempb.blkno < tempa.blkno) ) 
     return -1; //tempb is less than tempa 
    else if ((tempb.blkno >= tempa.blkno) && (tempb.blkno + tempb.bcount < tempa.blkno + tempa.bcount))  
     return 0; // tempa and tempb is equal, node fund in the map 
    else 
     return 1; //tempb is grater than tempa 
} 
+0

[STL映射和集合中的排序順序](http://stackoverflow.com/questions/3370185/sort-order-in-stl-map-and-set) – Joe 2011-04-20 04:47:09

回答

2

要使用類型的映射中的關鍵字或設置,您需要提供一個「小於」的比較,這需要兩個參數和返回true如果首先應在第二個之前。在一組使用它最簡單的方法是將其定義爲一個函數對象:

struct key_compare { 
    bool operator()(const iotrace_arh_node & a, const iotrace_arh_node & b) { 
     return a.blkno < b.blkno; 
    } 
}; 

,並用它在地圖中的「比較」模板參數或設置:

typedef std::set<iotrace_arh_node, key_compare> node_set; 

如果您需要不同的方式來比較鍵,然後你可以用不同的比較器創建不同的組。但是,一旦創建了集合,就不能更改比較器;按照比較器定義的順序存儲集合中的對象,因此更改它會使集合無法使用。如果您需要按不同字段搜索相同的設備,請查看Boost.MultiIndex

您不需要提供相等比較。

+0

+1,與我的相同,但更好的解釋 – 2011-04-20 05:14:30

+0

一個問題:在衝動我也會使比較器const&的參數,但我google了一下,它說參數應該是可分配的。你對那個怎麼想的? – 2011-04-20 05:15:57

+1

@Mario:類型必須是可分配的,才能用作鍵(因此像這樣的POD結構很好),但不需要比較器參數,除非比較器本身需要修改它們。唯一的要求是像'compare(a,b)'這樣的表達式是有效的,並且有一個類型可以轉換爲'bool'。 – 2011-04-20 05:21:19

2

標準比較函數在C和C++中有所不同。在C中,如你所寫,當第一個參數小於,等於或大於第二個參數時,返回-1,0或1。但在C++中,您應該重載<運算符,或者編寫一個與<運算符相同的比較函數,並將其名稱命名爲STL函數。但是你要確保你的<應該是傳遞(即a<b && b<c => a<c)這意味着你的key_compare功能應該是這樣的:

bool key_compare (const struct iotrace_arh_node& tempa, const struct iotrace_arh_node& tempb) 
{ 
return (tempa.blkno < tempb.blkno); 
} 

沒有必要定義key_equal,因爲(k1 == k2) <=> (!(k1<k2)&&!(k2<k1))。而AFAIK在插入和查找時不能使用不同的比較函數。

1

對於比較器,在這裏看到:STL Map with custom compare function object

struct my_comparer 
{ 
    bool operator() (const struct iotrace_arh_node& left, const struct iotrace_arh_node& right) 
    { 
     return left.blkno < rigth.blkno); 
    } 

} 

的比較器必須是一個二元謂詞,而不是一個簡單的函數。

然後你就可以在地圖使用它:

std::map<Key, Data, Compare, Alloc> 

(看這裏:http://www.cplusplus.com/reference/stl/map/

比較或Alloc有默認值。

什麼是你的鑰匙類型,順便說一句?

心連心

馬里奧

+0

感謝您的答案,我是使用'unsigned long long int blkno'作爲鍵。 – ARH 2011-04-20 06:54:24