std :: bind不能与std :: sort一起使用

时间:2017-02-16 15:23:16

标签: c++ visual-studio sorting bind

为什么只有在第二个参数大于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;
}

2 个答案:

答案 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的前面,则可以将partitiongreater_binded一起使用。致电partition(begin(v), end(v), greater_binded) results in

  

5 8 7 4 6 3 2 1

您还可以使用partition的返回值进一步:

  

迭代器到第二组的第一个元素

使用它对{<1}}的1 st 或2 nd 组进行排序或反向排序。