当前位置: 首页 > 知识库问答 >
问题:

如何为结构实现Ord?

朱典
2023-03-14

我见过一个类似的问题,但是没有人告诉我如何为结构实现Ord。例如,以下内容:

struct SomeNum {
    name: String,
    value: u32,
}

impl Ord for SomeNum {
    fn cmp(&self, other:&Self) -> Ordering {
        let size1 = self.value;
        let size2 = other.value;
        if size1 > size2 {
            Ordering::Less
        }
        if size1 < size2 {
            Ordering::Greater
        }
        Ordering::Equal
    }
}

这给了我一个错误:

error: the trait `core::cmp::Eq` is not implemented for the type `SomeNum` [E0277]

我该怎么解决这个问题?我尝试将实现更改为:

impl Ord for SomeNum where SomeNum: PartialOrd + PartialEq + Eq {...}

并添加适当的partial_cmpeq函数,但这给了我一个错误,即这两种方法都不是Ord的成员。

共有1个答案

杜绍元
2023-03-14

Ord的定义如下:

pub trait Ord: Eq + PartialOrd<Self> {
    fn cmp(&self, other: &Self) -> Ordering;
}

任何实现Ord的类型也必须实现EqParatalOrd

顺便说一句,您的实现看起来是错误的;如果self。值是您要比较的全部,self。价值

如果需要,您可以使用u32上的Ord实现来提供帮助:self。价值cmp(其他.value)

您还应考虑到,Ord是一个总订单。例如,如果您的PartialEq实现考虑了name,则您的Ord实现也必须考虑。为了方便起见,最好使用一个元组(表示比较中最重要的字段是,但如果它们相同,则应考虑名称),如下所示:

struct SomeNum {
    name: String,
    value: u32,
}

impl Ord for SomeNum {
    fn cmp(&self, other: &Self) -> Ordering {
        (self.value, &self.name).cmp(&(other.value, &other.name))
    }
}

impl PartialOrd for SomeNum {
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
        Some(self.cmp(other))
    }
}

impl PartialEq for SomeNum {
    fn eq(&self, other: &Self) -> bool {
        (self.value, &self.name) == (other.value, &other.name)
    }
}

impl Eq for SomeNum { }

如果您是这样做的,那么您最好对字段重新排序,并使用#[派生]

#[derive(PartialEq, Eq, PartialOrd, Ord)]
struct SomeNum {
    value: u32,
    name: String,
}

这将扩展到基本相同的事情。

 类似资料:
  • 我想创建一个食谱网站,在那里你可以添加/修改/删除食谱,每个模型都应该有一个配料的列表,与所需的量的那个配料。 我试图使用这样的dict:,但结果是EF Core并不真正喜欢dicts的思想,所以我试图创建一个“映射器”模型,如下所示: 问题是,它仍然没有真正起作用。我不能添加菜谱,也不能删除,因为它进入了一个永远循环。 你将如何实施它? 谢谢

  • 图的存储结构 图的存储结构除了要存储图中各个顶点的本身信息外,同时还要存储顶点与顶点之间的所有关系(边的信息),因此,图的结构比较复杂,很难以数据元素在存储区中的物理位置来表示元素之间的关系,但也正是由于其任意的特性,故物理表示方法很多。常用的图的存储结构有邻接矩阵、邻接表等。 邻接矩阵表示法 对于一个具有n个结点的图,可以使用n*n的矩阵(二维数组)来表示它们间的邻接关系。矩阵 A(i,j) =

  • 栈简介 栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。 它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。 栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,

  • 本文向大家介绍C#结构实现接口,包括了C#结构实现接口的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 语法问题。 已有代码 想请问下,impl Display for Point<T> 正确写法是啥样的?

  • 我正在尝试在C中实现MST的Prim算法。我有一个设计问题 我实现了一个min-heap,它需要一个整数,我们可以提取min、减少键和插入键。 现在,正如我在Prim的理解,我需要维护每个顶点的权重和邻居信息。我的一些想法是: 1]定义结构 使用min堆以最小权重返回节点。但是问题是减少键,因为对于减少键,调用者需要传递他想要减少键的顶点。由于堆交换元素的频率太高,我必须遍历整个列表以找到顶点,然