我在另一个问题中询问了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的特性(或者我只是误解了你的评论)。 –