2012-05-02 46 views
0

我試圖創建一個映射,其鍵和值均爲結構(STE和STR),所以我有這樣的事情:如何使用C++中的鍵和值創建一個映射?

struct stR{ 
    char* est; 
    char* et;  
}; 

struct stE{ 
     int num; 
     char* form; 
     char* et; 
     map<stE,stR> s; 
}; 

但是,當我想插入一個新元素:

stE e; 
e.num=1; 
e.form="a"; 
e.et="b"; 

stE f; 
f.num=2; 
f.form="c"; 
f.et="d"; 

stR r; 
r.est="e"; 
r.et=""; 

e.s.insert(make_pair(f, r)); 

它給了我一個錯誤:

C:\Dev-Cpp\include\c++\3.4.2\bits\stl_function.h In member function `bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = stEstado]':

我找不到什麼問題。任何人都可以幫我嗎? 在此先感謝。

+1

[STL與用戶定義的對象映射(的可能的複製http://stackoverflow.com/questions/1102392/stl-maps-與用戶定義的對象)和其他。 – juanchopanza

回答

3

使用地圖時,您需要提供一個小於運算符或給它一個比較器,因爲它會自動對這些鍵進行排序。

bool stE::operator< (const stE &); 
+2

您可能需要它,或者您必須聲明一個比較器類,並將其作爲第三個模板參數,並將其定義爲'struct stE'中的'map <...>'。 –

3

您需要提供strict weak ordering comparison,您可以通過定義operator<stE或通過仿的比較功能的地圖模板參數實現。 std::map看起來是這樣的:

template<class Key, class T, class Compare = std::less<Key>, ... > class map; 

默認情況下,Compare被設置爲使用T::operator<(const T&),但你可以通過它實現的邏輯你自己的仿函數類型。如果您無法修改實際的課程,這一點很重要。

請記住,該地圖需要能夠插入默認構造的stR對象,並且您當前的結構沒有默認構造函數,指針將被初始化爲隨機值。這可能是一個進一步的問題。

此外,您的鍵結構有一個地圖,它是它自己的鍵類型。這可能會導致遞歸問題,當您試圖實現小於比較:

struct stE{ 
    int num; 
    char* form; 
    char* et; 
    map<stE,stR> s; // how do we use this in the comparison? 
}; 
+0

std :: map不需要將其value_type設置爲默認可構造(一般)。 'map s;'成員更多的是一個問題,因爲在這一點上stE是不完整的,這是非法的(儘管並不是所有的實現都實際上拒絕它)。 – ymett

+0

@ymett如果映射的operator []被調用的映射中不存在的鍵,那麼該值將被默認構造。至於不完整的類型,我必須檢查標準。海灣合作委員會似乎吞下,沒有投訴:-) – juanchopanza

+0

所以,如果你想使用運營商[] value_type必須是默認constructible,否則不。許多實現實際上會接受不完整的類型,但標準說它是未定義的。 – ymett

相關問題