为什么只有在第二个参数大于3时才有效。我该如何解决? 如果我使用copy_if做同样的工作! 任务:检查函子std :: bind的效果。尝试使用它来形成标准仿函数std :: greater(module)的条件。
#include <set>
#include <algorithm>
#include <iostream>
#include <vector>
#include <list>
#include <map>
#include <iterator>
#include <string>
#include <functional>
using namespace std;
template<typename T>
static void PrintVector(const std::vector<T> &v)
{
for (auto iterator = v.begin(); iterator != v.end(); ++iterator)
{
std::cout << *iterator << " ";
}
std::cout << std::endl;
}
int main()
{
std::cout << "Task_3: greater with std::bind\n";
ostream_iterator<int> out_it(cout, " ");
vector<int> v = { 1, 8, 7, 4, 3, 6, 2, 5 };
PrintVector(v);
auto greater_binded = bind(greater<int>(), placeholders::_1, 3);
sort(v.begin(), v.end(), greater_binded);
PrintVector(v);
return 0;
}
答案 0 :(得分:1)
正如documentation中针对std::copy_if
所述,它期望一元谓词即具有一个参数的函数,另一方std::sort
需要比较函数,其必须满足Compare概念的要求。所以完全不清楚为什么你期望std::copy_if
使用std::sort
的同一函数与std::greater<int>
一起工作。
我该如何解决?
只需传递std::bind
而不将第二个参数绑定到常量。如果确实需要使用auto greater_binded = bind(greater<int>(), placeholders::_1, placeholders::_2);
,则可以传递两个参数:
greater<int>()
但这与直接传递var vueDifference = 20;
var speed = 0.03;
hColor = hColor + speed;
var wow = String("hsl(" + (hColor + i * vueDifference) + "," + 100 + "%" + "," + 70 + "%" + ")");
具有相同的效果。
答案 1 :(得分:0)
sort
的比较器要求是:
比较函数对象(即满足比较要求的对象),如果第一个参数小于(即在之前排序)第二个
,则返回true
greater
仿函数需要2个参数,但您使用bind
将其变为带有1个参数并将其与3
进行比较的仿函数。这不再满足sort
的要求。
如果您尝试将所有大于3
的元素移到v
的前面,则可以将partition
与greater_binded
一起使用。致电partition(begin(v), end(v), greater_binded)
results in:
5 8 7 4 6 3 2 1
您还可以使用partition
的返回值进一步:
迭代器到第二组的第一个元素
使用它对{<1}}的1 st 或2 nd 组进行排序或反向排序。