为什么这样做:
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<int> nums = {3, 7, 5};
std::cout << *min_element(nums.begin(), nums.end()) << "\n";
}
但这不是:
#include <algorithm>
#include <iostream>
int main() {
int nums[] = {3, 7, 5};
std::cout << *min_element(nums, nums + 3) << "\n";
}
我发现,如果在第二个示例中将调用更改为min_element
,因此它包含一个类似std::min_element
的名称空间,则可以正常工作。我不明白的是为什么在第一个示例中不需要这样做。 vector
是否以某种方式神奇地知道在哪里可以找到min_element
,如果可以,为什么?
答案 0 :(得分:3)
在第一个示例中,使用ADL并找到min_element
。在此示例中,min_element
的参数是迭代器(nums.begin(), nums.end()
)。
依赖于参数的查找(也称为ADL或Koenig查找)是用于在函数调用表达式中查找不合格函数名称的规则集,包括对重载运算符的隐式函数调用。 除了通常的非限定名称查找所考虑的范围和名称空间之外,还在其参数的名称空间中查找这些函数名称。
在您使用的实现中,begin()
的迭代器end()
和vector
以可能的方式实现。
在第二个示例中,这是不可能的,因为min_element
的参数只是数组nums
的地址。因此,您必须专门使用std::
才能使查询合格。