为什么这样做:
#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
,如果是,为什么?
在第一个例子中,使用ADL并找到min_element
。在这个例子中,min_element
的参数是迭代器(nums.begin(), nums.end()
)。
依赖于参数的查找(也称为ADL或Koenig查找)是用于在函数调用表达式中查找非限定函数名称的规则集,包括对重载运算符的隐式函数调用。除了通常的非限定名称查找所考虑的范围和名称空间之外,还会在其参数的名称空间中查找这些函数名称。
在你正在使用的实现中,begin()
的迭代器end()
和vector
以这样的方式实现,这是可能的。
在第二个例子中,这是不可能的,因为min_element
的参数只是数组nums
的地址。因此,您必须专门使用std::
,以便查找符合条件。