我在另一個問題中詢問了multiset中的問題,但現在我看到我需要一個體面的理解,並且在互聯網上找不到任何更復雜的示例。C++中的multiset
你能解釋一下我,可能是示例性的,multiset<A,B>
如何工作,A和B的功能是什麼,還有哪些可以省略?我可以把A或B放到一些變量中嗎? 我真的很感激一些簡單的例子或參考
我在另一個問題中詢問了multiset中的問題,但現在我看到我需要一個體面的理解,並且在互聯網上找不到任何更復雜的示例。C++中的multiset
你能解釋一下我,可能是示例性的,multiset<A,B>
如何工作,A和B的功能是什麼,還有哪些可以省略?我可以把A或B放到一些變量中嗎? 我真的很感激一些簡單的例子或參考
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);
}
@juanchopanza謝謝你,你的巨大幫助與[this](http://en.cppreference.com/ w/cpp/container/multiset)清除非常好!我還不確定的是:如果我把'multiset ',沒有'B'的功能有什麼區別?是否值得了解'less <>'如何使用布爾值對multimap的內容進行排序?我的意思是稍後可能需要這些知識用於某些應用。 – berndh
@eco_student'B'是一種方法,用於指定您想要用於排序的邏輯,或者在沒有有效的運算符<'時指定邏輯。對於給定類型的元素排序,您可能有不同的標準,因此您可以自由決定在每個集合/多個集合的基礎上使用哪個標準。 – juanchopanza
'的std :: multiset'是從最近的C++(特別是2011標準)文庫的標準模板。你一般熟悉C++模板嗎?你瞭解'std :: vector'和'std :: map'已經? –
http://www.sgi.com/tech/stl/multiset.html – DumbCoder
@BasileStarynkevitch實際上'std :: multiset'已經存在於C++ 98中,而你的評論聽起來像是C++ 11的特性(或者我只是誤解了你的評論)。 –