【问题标题】:What is the diffrence between std::greater{} and std::greater<int>()?std::greater{} 和 std::greater<int>() 有什么区别?
【发布时间】:2021-10-29 05:14:05
【问题描述】:

有人写

std::nth_element(v.begin(), v.begin()+1, v.end(), std::greater{});

有些人是这样写的

std::nth_element(v.begin(), v.begin()+1, v.end(), std::greater<int>());

std::greater{}std::greater&lt;int&gt;() 的区别是什么?

【问题讨论】:

    标签: c++ stl


    【解决方案1】:

    这是从 C++14 开始的新功能,这会产生两个完全不同的类。

    在 C++14 中,std::greater 为其模板参数获取默认值:void

    您最终得到std::greater&lt;void&gt;std::greater&lt;int&gt;

    std::greater&lt;void&gt; 是推导出其参数的so-called "transparent" comparator 的特化,请参阅其参考以获取更多信息。

    【讨论】:

      【解决方案2】:

      std::greater&lt;int&gt; 有一个bool operator()(int const&amp;,int const&amp;) const 调用&gt;

      std::greater&lt;&gt;,又名std::greater&lt;void&gt;,有一个模板引用auto operator()(T const&amp;, U const&amp;) const,它调用&gt;并推导出它的返回值。

      及更早版本中,greater&lt;void&gt;&lt;&gt; 将不起作用。

      在实践中,这里不会有任何区别。在任何非零优化下,两个版本的比较都会被内联。

      在其他情况下,void 版本可以让您比较不同的类型(使用合适的&lt; 或转换重载),并让您忽略正在比较的类型。

      另一个重要的细节是&lt;void&gt; 宣传了一个is_transparent 标签。当传递给像std::map 这样的容器时,它会将一些方法更改为具有模板参数。这允许使用std::string 键而不强制查找字符串成为相同的对象类型,这样可以节省副本和分配。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-11
        • 2018-09-18
        • 2013-01-27
        • 1970-01-01
        • 1970-01-01
        • 2013-05-10
        • 1970-01-01
        相关资源
        最近更新 更多