当前位置:  开发笔记 > 编程语言 > 正文

排序谓词的链接(例如对于std :: sort)

如何解决《排序谓词的链接(例如对于std::sort)》经验,为你挑选了1个好方法。

您可以将函数指针,函数对象(或boost lambda)传递给std :: sort,以定义要排序的容器元素的严格弱排序.

但是,有时候(足够我已经多次击中这个),你希望能够链接"原始"比较.

如果您正在排序表示联系人数据的对象集合,那么这将是一个简单的例子.有时你会想要排序

last name, first name, area code
.其他时间
first name, last name
- 还有其他时间
age, first name, area code
......等

现在,您当然可以为每个案例编写一个额外的函数对象,但这违反了DRY原则 - 特别是如果每​​个比较都不那么简单.

好像你应该能够写的比较功能的层次 - 水平低的人做单,原始,比较(例如,名字<名字),然后更高层次的人打电话相继较低级别的人(可能与链接&&使用短路评估)来生成复合函数.

这种方法的问题在于std :: sort采用二元谓词 - 谓词只能返回一个bool.因此,如果您正在编写它们,则无法判断"假"是表示相等还是大于.你可以让你的下级谓词返回一个int,具有三种状态 - 但你必须包裹在那些更高级别的谓词,他们可以用的std ::对自己的排序在使用之前.

总之,这些并非不可克服的问题.它似乎比它应该更难 - 并且肯定会邀请一个帮助库实现.

因此,有没有人知道任何预先存在的库(特别是如果它是std或boost库)可以帮助到这里 - 对此事有任何其他想法?

[更新]

正如一些评论中提到的那样 - 我已经开始编写自己的类实现来管理它.它相当小,并且可能在一般情况下存在一些问题.但在此基础上,对于任何有兴趣的人,课程在这里:

http://pastebin.com/f52a85e4f

一些辅助函数(以避免需要指定模板args)在这里:

http://pastebin.com/fa03d66e



1> Jesse Beder..:

你可以建立一个像这样的小链系统:

struct Type {
  string first, last;
  int age;
};

struct CmpFirst {
  bool operator () (const Type& lhs, const Type& rhs) { return lhs.first < rhs.first; }
};

struct CmpLast {
  bool operator () (const Type& lhs, const Type& rhs) { return lhs.last < rhs.last; }
};

struct CmpAge {
  bool operator () (const Type& lhs, const Type& rhs) { return lhs.age < rhs.age; }
};

template 
struct Chain {
  Chain(const First& f_, const Second& s_): f(f_), s(s_) {}

  bool operator () (const Type& lhs, const Type& rhs) {
    if(f(lhs, rhs))
      return true;
    if(f(rhs, lhs))
      return false;

    return s(lhs, rhs);
  }

  template 
  Chain  chain(const Next& next) const {
     return Chain  (*this, next);
  }

  First f;
  Second s;
};

struct False { bool operator() (const Type& lhs, const Type& rhs) { return false; } };

template 
Chain  make_chain(const Op& op) { return Chain  (False(), op); }

然后使用它:

vector  v;  // fill this baby up

sort(v.begin(), v.end(), make_chain(CmpLast()).chain(CmpFirst()).chain(CmpAge()));

最后一行有点冗长,但我认为很明显是什么意思.

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有