C++ 相当于 Python 的 cmp 或 Haskell 的 compare

标签 c++ python haskell

问题:

是否有与 Python 的 cmp 等效的 C++?或 Haskell 的 compare

compare就像operator==operator<在一个。它返回 LT , EQ , 或 GT .但它比同时调用 operator== 快两倍和 operator<因为它一次性完成。

更多详情:

在工作中,我经常将结构体用作映射的键​​,例如:

struct RecordUsedAsAKey {
    int field_a;
    string field_b;
    vector<float> field_c;

    // operator< is needed for keys in maps.
    bool operator<(const RecordUsedAsAKey& other) const;
};

bool RecordUsedAsAKey::operator<(const RecordUsedAsAKey& other) const {
    if (field_a != other.field_a)
        return field_a < other.field_a;
    if (field_b != other.field_b)
        return field_b < other.field_b;
    return field_c < other.field_c;
}

RecordUsedAsAKey::operator< 有一个问题是它不必要地慢。

  • string::operator!=找到一个不同的字符,程序在 string::operator< 中再次遍历相同的字符, 当它可以跳过那些..
  • 对于 vector 也是如此的比较。

如果我有一个相当于 Haskell 的 compare ,我的比较方法会更有效:

Ordering RecordUsedAsAKey::compare(const RecordUsedAsAKey& other) const {
    Ordering t;
    if ((t = field_a.compare(other.field_a)) != EQ)
        return t;
    if ((t = field_b.compare(other.field_b)) != EQ)
        return t;
    return field_c.compare(other.field_c);
}

这样效率更高,因为 stringcompare方法只传递一次字符串。

Btw/mini-flame-war:在 Haskell 中,用于比较的整个代码将只是 deriving Ord .

最佳答案

您可以轻松地自己实现它,作为一项免费功能。

#include <string>
#include <vector>
enum order {
    order_lt = -1,
    order_eq,
    order_gt
};

// General case, templated version.
template < typename T >
order compare(T left, T right) {
    if (left < right)
        return order_lt;
    if (left == right)
        return order_eq;
    return order_gt;
}

// Specialization
order compare(const std::string& left, const std::string& right) {
    return order(left.compare(right));
}
template < typename T >
order compare(const std::vector<T>& left, const std::vector<T>& right) {
     order o = compare(left.size(), right.size());
     if (o != order_eq)
         return o;
     for (size_t i = 0; i < left.size(); ++ i) {
         o = compare(left[i], right[i]);
         if (o != order_eq)
             return o;
     }
     return order_eq;
}

注意:我编辑了代码以包含适用于一般情况的模板化版本(前提是为类型定义了 operator< 和 operator== )。我还保留了一些特化,因为它可以提高某些类型(主要是容器)的运行时间。

编辑:使用 std::string::compare 而不是 strcmp

关于C++ 相当于 Python 的 cmp 或 Haskell 的 compare,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5257984/

相关文章:

python - Django 。动态编写通知并正确呈现它们

haskell - 为什么编译器无法将类型 'a==a' 与类型系列的 '` True' 匹配?

haskell - 这个惰性评估示例背后的魔力是什么?

c++ - 如何在派生类构造函数中初始化基类成员变量?

python - 机器学习,特征工程和呈现模型的常用技术有哪些?

c++ - 为什么项目 "run"在 NetBeans 内部终端中比在 Windows 命令提示符中更快?

python - 替代以 numpy 数组作为边界的排列

c++ - 生成给定长度的所有可能的 1 和 0 数组的算法

c++ - 有没有办法进行编译时检查,一个类的所有成员都在 operator== 中进行比较

C++ - 访问动态数组中的值