【问题标题】:Syntax for using std::greater when calling std::sort in C++在 C++ 中调用 std::sort 时使用 std::greater 的语法
【发布时间】:2013-08-05 11:41:24
【问题描述】:

反向排序容器的推荐方式(例如:Sorting a vector in descending order)似乎是:

std::sort(numbers.begin(), numbers.end(), std::greater<int>());

我知道第三个参数是帮助 sort() 进行比较的函数或仿函数,并且 std::greater 是模板仿函数,但我不明白这里发生了什么。我的 C++ 生锈了,所以如果这些是愚蠢的问题,请多多包涵:为什么std::greater<int> 后面有括号?我们是否在这里创建一个新的std::greater 对象?在这种情况下,我们为什么不需要new 关键字呢?

【问题讨论】:

  • 希望您不要将new 与创建对象联系在一起。
  • new 返回一个指针,而不是一个对象。
  • 在 C++ 之后我经历了很多语言,new 对我来说意味着很多东西,我认为这就是造成混乱的原因。 C++中只有动态分配的对象才需要new,否则可以直接调用构造函数,对吗?
  • @sundar 正确。不要使用new,除非你是动态分配的,即使那样只使用智能指针。

标签: c++ stl std


【解决方案1】:

为什么在 std::greater 后面有括号?我们是否在这里创建一个新的 std::greater 对象?

没错。表达式std::greater<int>() 对应于创建std::greater<int> 类型的对象。

在这种情况下,为什么我们不需要 new 关键字呢?

我们不需要new 关键字,因为对象是在堆栈上创建的,而不是在堆上。只有动态创建的对象才需要在堆上。区别很清楚here

基本上,在编译时,编译器已经知道要为对象分配多少内存,以及何时应该销毁它(即 std::sort 函数超出范围时)。任何时候都应该使用new

  • 此信息不可用——一个简单的例子是当你想创建一个对象数组,但你不知道有多少对象,直到程序实际运行;和/或
  • 您希望对象具有持久的存储持续时间,即您希望对象比创建它的作用域的生命周期更长。

【讨论】:

  • 正是我开始写的。 +1
  • 感谢您的精彩解释。一个澄清:“一个简单的例子是当你想创建一个对象数组,但你不知道什么时候;” - 你的意思是说“不知道有多少;”这里?如果不是,恐怕我不明白那部分是什么意思。
  • @sundar 对不起,你是对的,我的意思是“你不知道有多少”
  • (2) 从hereinterface to std::sort,我相信它确实被复制了。事实上,现在我很好奇为什么它不是简单地通过引用传递。如果您不这样做,我可能会自己问这个问题:)
  • 你说得对,对象没有放在堆上;然而,这并不意味着它被放置在堆栈上。在这种情况下,它可能仅在编译期间用于类型信息,并完全优化。
猜你喜欢
  • 2013-01-27
  • 2019-02-11
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 2021-10-29
  • 2020-11-03
  • 2012-12-22
相关资源
最近更新 更多