有没有理由find_if,for_each,count等不需要std ::?

时间:2016-12-17 17:40:06

标签: c++ algorithm c++11 std

我刚刚发现标准+标头中的几种算法不需要algorithm

示例:

std::

Live demo at coliru

有什么具体原因吗? #include <vector> #include <algorithm> int main() { std::vector<int> m; count(m.begin(), m.end(), 0); count_if(m.begin(), m.end(), [](auto){return true;}); for_each(m.begin(), m.end(), [](auto){}); find_if(m.begin(), m.end(), [](auto){return true;}); } g++都接受上述代码。

1 个答案:

答案 0 :(得分:6)

这里有两件事情。

首先是ADL,或Argument Dependent Name Lookup

通过ADL找到这些功能。这是因为某些参数(即vector的{​​{1}}类型)位于iterator中,因此当重载解析查找std时,它会查找通常的命名空间集(在本例中为root),加上由其参数的名称空间确定的名称空间。

诀窍是for_each 无法保证vector::iterator中的类型。所以你的代码不能保证工作。 可能namespace std中的类型,或者它可以是原始指针,也可以是std或其他任何地方的类型。

所有主要编译器库都有namespace __std__utility_types个迭代器不是指针,它们位于vector,因为替代方案被认为更糟。但缺乏保证意味着你不应该依赖它来获得真正的可移植代码。