#include <algorithm>
#include <vector>
template <class BidirectionalIterator, class UnaryPredicate>
BidirectionalIterator partition(BidirectionalIterator first,
BidirectionalIterator last, UnaryPredicate pred)
{
while (first != last) {
while (pred(*first)) {
++first;
if (first == last) return first;
}
do {
--last;
if (first == last) return first;
} while (!pred(*last));
std::swap(*first, *last);
++first;
}
return first;
}
int main() {
std::vector<int> v = { 1, 55, 17, 65, 40, 18, 77, 37, 77, 37 };
partition(v.begin(), v.end(), [](const int &i) {
return i < 40;
});
return 0;
}
代码无法编译。 clang ++(3.5.2 / cygwin)和Visual Studio(2013)都抱怨模糊的电话。由于没有使用using
指令,我不明白什么是错的。
要成功编译,请使用::
前缀帮助。
答案 0 :(得分:8)
您的partition
名称与std::partition
即使没有std::
前缀,它也是这样做的原因是因为它在std::vector<int>::iterator
的参数上使用argument dependent lookup (ADL),它带有std::
命名空间。因此,编译器能够看到&#34; std::partition
函数以及partition
函数。
From cppreference(强调我的)
... 对于函数调用表达式中的每个参数和对于模板函数的每个模板参数,其类型将被检查为确定关联的集合命名空间以及它将添加到查找的类