2010-03-29 49 views
0

我想使用STL列表中的迭代器作爲映射中的鍵。例如:爲列表迭代器映射定義<運算符

using namespace std;

list<int> l ;
map<list<int>::const_iterator, int> t;

int main(int argv, char * argc) {
l.push_back(1);
t[l.begin()] = 5;
}

然而,列表迭代沒有定義(與隨機訪問迭代)比較運算符,所以編譯一個錯誤上面的代碼的結果:

的/ usr /包括/ C++ /4.2.1/bits/stl_function.h:227:錯誤:沒有對應於「__X < __y」

如果列表變更爲矢量「操作<」,地圖矢量const_iterators的編譯罰款。

爲list :: const_iterator定義運算符<的正確方法是什麼?

+1

爲了什麼?你在那裏有一個奇怪的裝置。 :) – GManNickG 2010-03-29 04:52:29

+0

以上是最小的,有點毫無意義的例子,但在我的真實程序中,我有一個std ::對象列表(這是一個列表,因爲我需要能夠快速從中間刪除元素),並且我正在構建一些其他數據結構需要指向該列表中的不同點。 – 2010-03-29 05:00:18

回答

4

參數化map使用自定義比較:

struct dereference_compare { 
    template <class I> 
    bool operator()(const I& a, const I& b) { 
     return *a < *b; 
    } 
}; 
map<list<int>::const_iterator, int, dereference_compare> t; 
+2

爲了便於使用,我將它重命名爲「dereference_compare」並將模板移動到'operator()'。以'I'作爲'const&'。 – GManNickG 2010-03-29 04:56:22

+0

感謝您的提示,@GMan。 – 2010-03-29 05:13:16

+0

感謝您的幫助!那就是訣竅。 – 2010-03-29 05:17:02