c – 运算符<比较多个字段
我有以下运算符<这应该首先按值排序,然后再按另一个值排序:
inline bool operator < (const obj& a,const obj& b) { if(a.field1< b.field1) return true; else return a.field2 < b.field2; } 我有这样的感觉,这是不正确的,你不能这样做没有另一个第三次比较测试成员变量,但我找不到任何例子,这不起作用. 编辑: inline bool operator < (const obj& a,const obj& b) { if(a.field1< b.field1) return true; else if(a.field1> b.field1) return false; else return a.field2 < b.field2; } 有什么区别吗?我问,因为我知道我的经验是正确的,但也比第一个更长 解决方法
我想自己做这一切
如果Obj :: field1的值相等,则应该仅比较Obj :: field2的值. 易于理解的方式: /* This will meet the requirements of Strict-Weak-Ordering */ if (a.field1 != b.field1) return a.field1 < b.field1; else return a.field2 < b.field2; 正确(推荐)方式: 实施它的“正确”方式仅使用操作符<要比较这些领域,下面看起来比实际更复杂. 然而,它将产生与之前编写的易于理解的示例相同的结果. return a.field1 < b.field1 || ( !(b.field1 < a.field1) && a.field2 < b.field2 ); 必须有一种实现运算符的方法,没有引起很多头痛? C 11 您可以使用STL中的std :: tuple,该STL已经具有运算符<对于定义的多个字段,例如在下面的示例中. #include <utility> ... inline bool operator< (Obj const& lhs,Obj const& rhs) { return std::tie (lhs.field1,lhs.field2) < std::tie (rhs.field1,rhs.field); } C 03 如果您的编译器不支持C 11,而您只需要比较每个对象的两个字段,可以使用std :: pair. std :: make_pair的原因与上一个使用std :: tie的例子相同. #include <utility> ... inline bool operator< (Obj const& lhs,Obj const& rhs) { return std::make_pair (lhs.field1,lhs.field2) < std::make_pair (rhs.field1,rhs.field2); } 使用std :: pair将需要创建的成员的副本,这在某些情况下是不希望的. 这是真的推荐做法吗? 有关更多信息,请参阅以下问题/答案,但总结一下; c 11方法不会导致太多的开销,实现起来很简单. > Implementing comparision operators via ‘tuple’ and ‘tie’,a good idea? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在cocos creator中使用protobufjs(三)
- flashback空间爆满IMAGECOPY 占的比率最大,通过RMAN释放空
- ruby-on-rails – 使用Rails 3的PostgreSQL JSON列类型
- 使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的
- cocos2d-iphone – 带有cocos2d 3.0的CCTableView
- Apple / iPhone开发IDE首选项?
- JSONObject.fromObject--JSON与对象的转换
- oracle plsql 异常
- 关于 Swift
- solr – Data-config.xml和mysql – 我只能加载“id”列