c++ - C++等同于Python的cmp或Haskell的比较

标签 c++ python haskell

问题:

是否有C++等效于Python的cmp或Haskell的compare
compare就像operator==operator<一样。它返回LTEQGT。但这是同时调用operator==operator<的速度的两倍,因为它可以一次性完成。

更多详细信息:

在工作中,我经常有用作 map 键的结构,例如:

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++ - C++等同于Python的cmp或Haskell的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5257984/

    相关文章:

    区分枚举类和常规枚举的 C++11 类型特征

    python - 在Python 3列表中查找唯一值索引的最有效方法

    haskell - 图形缩减/棘手的空间泄漏示例

    haskell - 关于映射到多参数函数的最终结果

    haskell - Netwire 中的控制台交互性?

    c++ - 动态创建的复选框的事件处理程序

    c++ - 任何运算符后矩阵都相同

    c++ - 使用临时字符串构建istringstream

    python - 在这段代码中是否真的需要互斥锁?

    python - 如何将函数应用于两列 Pandas 数据框和两列 if 函数