gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:03:51 26 4
gpt4 key购买 nike

问题:

是否有与 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com