我正在研究C++,我发现了这种奇怪的语法。&_
是什么意思,为什么作者可以使用变量作为_1st
?
std::sort(open_list.begin(), open_list.end(), [] (const auto &_1st, const auto &_2st) {
return _1st->h_value + _1st->g_value < _2st->h_value + _2st->g_value
});
编辑 1
我认为为了创建变量的引用,有必要使用与号运算符后跟名称,例如:& _1st(注意它们之间的空格)。
下划线是用C++声明名称变量的特殊方法吗?
&
用于声明引用;所以const auto &_1st
声明一个名为_1st
的参数,其类型是lvalue-reference(toconst
)。它与const auto & _1st
相同,空格是多余的;您甚至可以将其写为const auto&_1st
,这对于下划线来说并不特别。
请注意,下划线可用于标识符。
标识符是任意长的数字序列、下划线、小写和大写拉丁字母以及大多数 Unicode 字符(有关详细信息,请参见下文)。有效标识符必须以非数字字符(拉丁字母、下划线或 Unicode 非数字字符)开头。
const auto &_1st
这将声明一个名为_1st
的参数。&
表示它是通过引用函数传递的。
变量只能根据特定规则使用。它不能直接以数字开头,所以作者使用了 _(下划线)。 看看这个:https://www.sitesbay.com/cpp/cpp-variable-declaration
与号用于表示通过引用传递。
操作是&
+ variable_name,而不是&_
+variable_name。
在此上下文中,&
后跟变量表示将此变量的指针作为函数参数之一传递。您可能会注意到,在您粘贴的代码中,std::sort
的第三个很长的参数实际上是一个 lambda 表达式(一个函数):
[] (const auto &_1st, const auto &_2st) {
return _1st->h_value + _1st->g_value < _2st->h_value + _2st->g_value
}
它对应于根据 HERE 的第三个sort
参数,下面是一个简短的引用:
比较
接受范围内的两个元素作为参数的二进制函数,并返回可转换为 bool 的值。返回的值指示作为第一个参数传递的元素是否被视为在其定义的特定严格弱排序中先于第二个参数。 该函数不得修改其任何参数。 这可以是函数指针或函数对象。
所以基本上当你想用你专门定义的规则对一种类型的变量进行排序,或者 c++ 不知道如何比较你试图排序的目标时,你必须定义一个函数告诉 c++ 如何执行排序。
有关详细信息,您可能还想看看 THIS。
将变量作为引用指针传递而不是按值传递的原因很少。在许多情况下,您只是不想创建额外的内存消耗并节省时间,通过引用传递允许您访问值而无需复制。详情请参阅此处
这只是一个命名约定,用于声明由该代码片段中的某人编写的变量。
因此,_1st
和_2nd
只是auto
类型的引用变量。
下面的代码也可以正常工作:
std::sort(open_list.begin(), open_list.end(), [] (const auto &first, const auto &second) {
return first->h_value + first->g_value < second->h_value + second->g_value
});