【问题标题】:What is the difference between "multiset<int, greater<int> > ms1" and "multiset<int> ms2(greater<int>())"“multiset<int,greater<int> > ms1”和“multiset<int> ms2(greater<int>())”有什么区别
【发布时间】:2017-10-03 23:54:54
【问题描述】:

在我看来,它们是相同的。但在 Visual Studio 2015 中,它们肯定是不同的。

//Ok, work properly
multiset<int, greater<int> > ms1;
ms1.insert(10);
ms1.insert(20);

//error, why?
multiset<int> ms2(greater<int>());
ms2.insert(30);
ms2.insert(40);

不知道为什么?

【问题讨论】:

  • 不,它们不一样。是什么让您认为它们是相同的?
  • 没有答案here?
  • @user0042:不是,不是。这个问题是关于对模板参数和函数/构造函数参数之间的区别缺乏理解。这是一个核心语言问题。真的不是关于std::multiset,这只是他在误会出现时碰巧玩的玩具。
  • std::multiset 将其第一个模板参数作为类型,将第二个模板参数作为比较函数。您不能将比较函数放在构造函数参数中。你明白什么是构造函数吗?这可能会给你一个很好的提示,说明为什么这看起来真的很奇怪,不应该混淆
  • @Benjamin 你可能是对的。

标签: c++ multiset


【解决方案1】:

第一个例子:

multiset<int, greater<int> > ms1;

这表示ms1std::multiset,存储int,并使用std::greater&lt;int&gt; 类型的比较函子。您省略了构造函数参数,因此函子的实例是默认构造的,就像您传递了 std::greater&lt;int&gt;{} 一样,如下所示:

multiset<int, greater<int> > ms1(greater<int>{});

在你的第二个例子中:

multiset<int> ms2(greater<int>());

这个有点棘手。这里有2个问题。第一个与所谓的“最令人烦恼的解析”有关。它已经被回答了很多次,所以我将简单地链接到其中一个答案。 Most vexing parse: why doesn't A a(()); work?

假设您理解这一点,并据此修改您的代码:

multiset<int> ms2(greater<int>{});
// or this
multiset<int> ms2((greater<int>()));

在这种情况下,您忽略了比较函子的类型,并使用了默认值。默认值为std::less&lt;int&gt;。所以上面这行等价于:

multiset<int, std::less<int> > ms2(greater<int>{});

这说明ms2 是一个std::multiset,存储int,并使用std::less&lt;int&gt; 类型的比较函子。然后,您将 std::greater&lt;int&gt; 的实例传递给构造函数。 std::less&lt;int&gt;std::greater&lt;int&gt; 是不同的类型。您不能将一个实例传递给期望另一个实例的函数。

【讨论】:

  • @Tango Xiao:我忘了一个问题,我已经更新了我的答案。
  • @TangoXiao:见上面的评论。总之,试试multiset&lt;int, greater&lt;int&gt; &gt; ms3(greater&lt;int&gt;{});
  • 你的回答太棒了。我明白。非常感谢。
猜你喜欢
  • 2021-10-29
  • 1970-01-01
  • 2017-02-23
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 2020-05-05
  • 2015-11-04
  • 1970-01-01
相关资源
最近更新 更多