C 11 – 绑定排序功能

我想保存自己一些打字,因此定义如下:
using namespace std;

vector<MyClass> vec;

auto vecsort = bind(sort,vec.begin(),vec.end(),[] (MyClass const &a,MyClass const &b) {
        // custom comparison function
    });

vecsort(); // I want to use vecsort() a lot afterwards

由于某种原因,这不能编译 – 为什么?

使用boost不是一个选项.

最小工作实例:

#include <vector>
#include <utility>
#include <algorithm>
#include <functional>

using namespace std;

int main() {

    vector<pair<int,int>> vec;
    for (int i = 0; i < 10; i++)
        vec.push_back(make_pair(10 - i,0));

    auto vecsort = bind(sort,[] (pair<int,int> const &a,pair<int,int> const &b) {
            return a.first < b.first;
        });

    vecsort();

}

错误

error: no matching function for call to 'bind(<unresolved overloaded function type>,std::vector<std::pair<int,int> >::iterator,main()::__lambda0)'

解决方法

问题是std :: sort不是一个函数对象.它是一个功能模板.处理问题的最简单的方法是创建一个简单的包装器对象:
struct sorter {
    template <typename RndIt,typename Cmp>
    void operator()(RndIt begin,RndIt end,Cmp cmp) {
        std::sort(begin,end,cmp);
    }
};

现在可以使用

std::bind(sorter(),[](...){ ... });

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...