2014-03-24 69 views
-1

我在嘗試使用STL的地圖這麼多不同的問題,實在是令人沮喪包含HashMap的地圖,無序的地圖,類作爲鍵

,所以我得到了很多問題:

  • 首先我有一個有些問題「<運營商沒有定義」,但我並不需要在我的地圖上任意排序(爲什麼會有人需要,默認情況下是這樣) ,所以我發現unordered_map,但我必須使用C++ 11什麼的,不知道這是什麼意思 ,我不確定這是一個好主意,是標準C?它是否便攜?

  • 然後我得到了一些奇怪的錯誤:

    /usr/include/c++/4.8/bits/hashtable_policy.h:1070:12:錯誤:無效使用不完整的類型結構性病的」 ::哈希< FOLVariable >'

那麼爲什麼模板如此侵入?我的意思是它應該作爲一個容器行事,不介意是什麼對象約也不是什麼它裏面

任何人都可以幫我這個錯誤?

感謝

+0

另請參閱http://stackoverflow.com/questions/17016175/c-unordered-map-using-a-custom-class-type-as-the-key – juanchopanza

回答

0

map存儲其元素通過鍵進行排序;所以你需要定義這個順序。

如果該鍵是一個類類型,你可以過載operator<,這樣的std::less作品的默認排序:

bool operator<(my_thing const & a, my_thing const & b) { 
    // return true if "a" is ordered before "b" 
} 

std::map<my_thing, something_else> my_map; 

,或者你可以提供自己的比較仿函數

struct compare_my_thing { 
    bool operator()(my_thing const & a, my_thing const & b) { 
     // return true if 'a' is ordered before 'b' 
    } 
}; 

std::map<my_thing, something_else, compare_my_thing> my_map; 

unordered_map是一個哈希表;所以你需要定義一個散列函數和一個平均值比較的方法(因爲散列通常不是唯一的)。同樣,你可以提供過載,使缺省值(std::hashstd::equal_to)工作:

namespace std { 
    template <> 
    struct hash<my_thing> { 
     std::size_t operator()(my_thing const & t) const { 
      // return hash of 't' 
     } 
    }; 
} 

bool operator==(my_thing const & a, my_thing const & b) { 
    // return true if 'a' and 'b' are equal 
} 

std::unordered_map<my_thing, something_else> my_map; 

,或者你可以提供自己的仿函數

struct hash_my_thing { 
    std::size_t operator()(my_thing const & t) const { 
     // return hash of 't' 
    } 
}; 

struct compare_my_thing { 
    bool operator()(my_thing const & a, my_thing const & b) { 
     // return true if 'a' and 'b' are equal 
    } 
}; 

std::unordered_map<my_thing, something_else, hash_my_thing, compare_my_thing> my_map; 

so why is the template so intrusive? i mean it should act as a container, not minding what is the object about nor what is inside of it

不同的容器具有它們所包含的不同要求類型。例如,yhey都要求它們是可破壞的,因爲容器負責管理它們的生命週期。有些要求它們是可移動的;例如,vector在分配更大的數組時需要移動元素以使它們保留在其中。關聯容器對其關鍵類型有額外的要求,以允許它們用作關鍵點。

+0

好的,謝謝你這個完整的答案,但爲什麼不只需根據對象的指針地址來進行比較/排序? – fdsfdsfdsfds

+1

因爲你不存儲指針。 –

+0

@ user3455897:因爲這將檢查*身份*而不*等價*或*相等*。 'find(some_key)'永遠不會成功,因爲'some_key'本身不在地圖中。 –

0

first i had a problem with some " < operator not defined", but i did not need any ordering in my maps(why would anyone need that by default anyway)

documentation

std::map is a sorted associative container that contains key-value pairs with unique keys. Keys are sorted by using the comparison function Compare.

重點煤礦。默認情況下,比較功能是operator <

so i found unordered_map but i have to use c++11 or something, don't know what it means and i am not sure this is a good idea, is it standard c? is it portable ?

C++ 11是最新的C++標準的名稱。現在大多數現代編譯器都支持該標準的大多數主要功能。如果你的編譯器支持它,那麼使用你需要的功能是個好主意。這不是標準的C,但它是標準的C++。

then i got some weird error:

/usr/include/c++/4.8/bits/hashtable_policy.h:1070:12: error: invalid use of incomplete type ‘struct std::hash< FOLVariable>’

std::unordered_map是一個散列表。默認情況下,用於std::unordered_map<Key, Value>的散列函數是std::hash<Key>的專用函數。你得到的錯誤是因爲你的類型FOLVariable沒有這種專業化。

+0

感謝您的回答,對於重複的抱歉,我真的找不到以前的線程關於同一問題 – fdsfdsfdsfds