2012-11-22 35 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