4

反向排序容器的推荐方式(例如:按降序排序向量)似乎是:

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

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

4

1 回答 1

6

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

这是正确的。该表达式std::greater<int>()对应于创建一个类型为 的对象std::greater<int>

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

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

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

  • 此信息不可用 - 一个简单的示例是当您想要创建一个对象数组,但您不知道有多少对象,直到程序实际运行;和/或
  • 您希望对象具有持久的存储持续时间,即您希望对象比创建它的范围的生命周期更长。
于 2013-08-04T19:38:44.193 回答