7

我在另一个关于std::multiset的问题中问过,但现在我发现我需要一个体面的理解,并且在互联网上找不到任何更复杂的例子。

你能向我解释一下,也许可以举例说明std::multiset<A,B>,A 和 B 的工作原理和功能是什么,以及是否可以省略其中的任何一个?我可以将 A 或 B 放入某个变量吗?我真的很感激一些简短的例子或参考,

4

1 回答 1

21

std::multiset类模板具有第一个模板参数,指定要存储在集合中的对象的类型,第二个模板参数指定比较函子的类型。我们现在可以忽略第三个模板参数。

第二个,可选参数,B必须实现严格的弱排序,用于对集合/多重集合进行排序。需要这种排序以确保元素查找操作的对数复杂性。这是一个例子:

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);

set/multiset 需要将元素放置在正确的位置,并确定两个元素是否相同。如果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);
}
于 2012-11-22T14:38:23.330 回答