我正在研究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 ++中声明名称变量的一种特殊方法吗?
答案 0 :(得分:8)
&
用于声明引用;因此const auto &_1st
声明了一个名为_1st
的参数,其类型为lvalue-reference(到const
)。与const auto & _1st
相同,并且空格为多余;您甚至可以将其写为const auto&_1st
,这对于下划线并不特殊。
请注意,下划线可用于identifiers。
标识符是由数字,下划线,小写和大写拉丁字母以及大多数Unicode字符组成的任意长序列(请参见下文以了解详细信息)。有效的标识符必须以非数字字符(拉丁字母,下划线或Unicode非数字字符)开头。
答案 1 :(得分:3)
const auto &_1st
这将声明一个名称为_1st
的参数。 &
表示已通过引用传递给函数。
答案 2 :(得分:3)
只能根据特定规则使用变量。它不能直接以数字开头,因此作者使用了_(下划线)。 调查一下:https://www.sitesbay.com/cpp/cpp-variable-declaration
“&”符号用于表示按引用传递。
答案 3 :(得分:1)
该操作为&
+ 变量名,而不是&_
+ 变量名。
在这种情况下,&
后跟一个变量意味着将这个变量的指针作为函数参数之一传递。您可能会注意到,在粘贴的代码中,std::sort
的第三个非常长的参数实际上是lambda表达式(一个函数):
[] (const auto &_1st, const auto &_2st) {
return _1st->h_value + _1st->g_value < _2st->h_value + _2st->g_value
}
它对应于HERE中sort
的第三个参数,下面是一个短引号:
comp
二进制函数,该函数接受范围内的两个元素作为参数,并返回可转换为bool的值。返回的值指示是否按其定义的特定严格弱顺序将作为第一个参数传递的元素视为在第二个参数之前。 该函数不得修改其任何参数。 这可以是一个函数指针或一个函数对象。
因此,基本上,当您想使用特定定义的规则对变量类型进行排序,或者c ++不知道如何比较要排序的目标时,必须定义一个函数来告诉c ++如何执行排序。
有关详细信息,您可能还想看看THIS。
没有什么理由将变量作为引用指针而不是按值传递。在许多情况下,您只是不想增加内存消耗并节省时间,通过引用传递允许您访问值而无需进行复制。有关详细信息,请参阅HERE
答案 4 :(得分:0)
这只是一个命名约定,用于声明由某个人在该代码段中编写的变量。
因此,_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
});