2012-11-22 65 views
6

我在另一個問題中詢問了multiset中的問題,但現在我看到我需要一個體面的理解,並且在互聯網上找不到任何更復雜的示例。C++中的multiset

你能解釋一下我,可能是示例性的,multiset<A,B>如何工作,A和B的功能是什麼,還有哪些可以省略?我可以把A或B放到一些變量中嗎? 我真的很感激一些簡單的例子或參考

+1

'的std :: multiset'是從最近的C++(特別是2011標準)文庫的標準模板。你一般熟悉C++模板嗎?你瞭解'std :: vector'和'std :: map'已經? –

+0

http://www.sgi.com/tech/stl/multiset.html – DumbCoder

+0

@BasileStarynkevitch實際上'std :: multiset'已經存在於C++ 98中,而你的評論聽起來像是C++ 11的特性(或者我只是誤解了你的評論)。 –

回答

17

std::multiset類模板有一個第一個模板參數,指定要存儲在集合中的對象的類型,第二個指定比較函子的類型。現在我們可以忽略第三個模板參數。

第二個可選參數B必須實現strict weak ordering並用於排序集/多集。爲了確保元素查找操作的對數複雜性,需要此順序。下面是一個例子:

struct A 
{ 
    int x; 
}; 

struct B 
{ 
    bool operator()(const A& lhs, const A& rhs) const { 
    return lhs.x < rhs.x; 
    } 
}; 

該類B具有operator(),這意味着它可以被稱爲,例如

B comp; 
A a1, a2; 
bool a1lessThana2 = comp(a1, a2); 

這需要用於設置/多重集放置在正確的元件位置,並找出兩個元素是否相同。如果您的類型有operator<,則可以省略第二個模板參數。

bool operator<(constA& lhs, const A& rhs) { return lhs.x < rhs.x; } 

這是使用的例子:

int main() 
{ 
    std::multiset<A, B> m; 
    A a1, a2; 
    a1.x = 23; 
    a2.x = 100; 
    m.insert(a1); 
    m.insert(a2); 
} 
+0

@juanchopanza謝謝你,你的巨大幫助與[this](http://en.cppreference.com/ w/cpp/container/multiset)清除非常好!我還不確定的是:如果我把'multiset ',沒有'B'的功能有什麼區別?是否值得了解'less <>'如何使用布爾值對multimap的內容進行排序?我的意思是稍後可能需要這些知識用於某些應用。 – berndh

+1

@eco_student'B'是一種方法,用於指定您想要用於排序的邏輯,或者在沒有有效的運算符<'時指定邏輯。對於給定類型的元素排序,您可能有不同的標準,因此您可以自由決定在每個集合/多個集合的基礎上使用哪個標準。 – juanchopanza