Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中调用std::sort时使用std::greater的语法+;_C++_Stl_Std - Fatal编程技术网

C++ 在C+中调用std::sort时使用std::greater的语法+;

C++ 在C+中调用std::sort时使用std::greater的语法+;,c++,stl,std,C++,Stl,Std,按相反顺序分拣容器的推荐方法(例如:)似乎是: std::sort(numbers.begin()、numbers.end()、std::greater()) 我知道第三个参数是一个函数或一个有助于sort()进行比较的函子,std::greater是一个模板函子,但我不知道这里发生了什么。我的C++是很生疏的,所以如果这些是愚蠢的问题,请耐心等待我:为什么在代码> STD::大的< /代码>后面有括号?我们正在创建一个新的std::greater对象吗?在这种情况下,我们为什么不在这里使用ne

按相反顺序分拣容器的推荐方法(例如:)似乎是:

std::sort(numbers.begin()、numbers.end()、std::greater())

我知道第三个参数是一个函数或一个有助于sort()进行比较的函子,std::greater是一个模板函子,但我不知道这里发生了什么。我的C++是很生疏的,所以如果这些是愚蠢的问题,请耐心等待我:为什么在代码> STD::大的< /代码>后面有括号?我们正在创建一个新的
std::greater
对象吗?在这种情况下,我们为什么不在这里使用
new
关键字呢

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

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

在这种情况下,我们为什么不在这里使用新的关键字呢

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

基本上,在编译时,编译器已经知道要为对象分配多少内存,以及什么时候应该销毁它(也就是当std::sort函数超出范围时)<代码>新建
应在任何时候使用

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

  • <>我希望你不要把代码>新的<代码>与创建对象联系起来。<代码>新< /Cord>返回一个指针,而不是一个对象。C++之后我已经通过了很多语言,<代码>新< /C> >对我来说意味着很多事情,我认为这就是混淆的原因。在C++中,新的只需要动态分配的对象,否则您可以直接调用构造函数,这是正确的吗?除非是动态分配,否则不要使用
    new
    ,即使这样,也要使用智能指针。这正是我开始写的+谢谢你的解释。一个澄清:“一个简单的例子是当你想创建一个对象数组,但你不知道什么时候;”-你的意思是说“不知道有多少;”?如果没有,恐怕我不明白那部分的意思。@sundar对不起,你是对的,我的意思是“你不知道有多少”(2)从,从,我相信它确实被复制了。事实上,现在我很好奇为什么它不是简单地通过引用传递的。如果你不知道的话,我可以自己问这个问题:)你是对的,对象没有放在堆上;然而,这并不意味着它被放在堆栈上。在本例中,它可能只在编译期间用于类型信息,并完全优化。