<链表C ++中结构成员的运算符重载

Posted

技术标签:

【中文标题】<链表C ++中结构成员的运算符重载【英文标题】:< operator overloading for struct member in linked list C++ 【发布时间】:2021-11-05 16:42:03 【问题描述】:

所以基本上我有我的结构,它在将数据分配给链表的值之前保留数据并帮助我稍后检索它

struct Student


private:

    string surname ;
    string names ;
    int index;
    float mark;

这是我插入排序链表的实现

template<typename T>
void List<T>::insert(T v)

    Node* pred = nullptr;
    Node* succ = head;

    while(succ != nullptr && succ->value < v) <- here
    
        pred = succ;
        succ = succ->next;
    
...

我的问题是我需要按 index 对其进行排序,而我的

bool operator<(const Student&)
    return  next->index < this->index;

我对 == 或 + 等运算符进行了重载,但从来没有

【问题讨论】:

您能否edit 提出您的问题,并用一个完整的minimal reproducible example 替换所有孤立的代码sn-ps,其他人都可以剪切/粘贴如图所示 i> 放入一个空文件,然后编译、运行并重现您的问题? “我的所有实现……似乎都不起作用”是什么意思? operator&lt; 应该采用两个 Student 对象(通过引用),如果第一个小于第二个,则返回 true。只写那个函数。 方便阅读全面的运营商:What are the basic rules and idioms for operator overloading? 您能否解释一下您认为operator&lt; 应该如何/为什么起作用?从一个例子开始可能会有所帮助,比如从 Student a; Student b; 开始,添加合适的初始化,然后遍历表达式 a &lt; b,也就是 a.operator&lt;(b) 的评估。 (强迫自己向别人解释你的推理是一种有效的调试技术,有时称为rubber duck debugging。) 对于像 “没有 [...] 似乎可以工作” 这样详细的问题描述,“因为他们有错误”的答案似乎处于大致相同的水平乐于助人。是什么导致您得出结论,您的问题中的operator&lt; 版本不起作用?编译时出错? (复制粘贴错误信息。) 运行时出现奇怪的命令? (给出一个实际和预期结果的具体例子。)那些奇怪的“未定义行为”结果之一,比如格式化你的硬盘? 【参考方案1】:

indexprivate,这意味着您需要将其设为成员函数或将其声明为friend

struct Student 

    bool operator<(const Student& other) const 
        return index < other.index;
    

private:
    string surname;
    string names;
    int index;
    float mark;
;

您可以指定this-&gt;index 而不仅仅是index,但大多数时候这不是必需的。

另外,作为旁注,如果您使用 C++ 20,我建议重载 spaceship operator,因为所有比较运算符(==!= 除外)都会重载 automatically generate appropriate definitions:

    auto operator<=>(const Student& other) 
        return index <=> other.index;
    

【讨论】:

"您需要将其设为成员函数或 [...]" -- 鉴于问题的版本仅显示此 binary 运算符,我猜它已经是一个成员函数。与您介绍operator&lt;=&gt; 的设置类似,不是吗? (当然,如果你不喜欢猜测,你可以在回答之前要求澄清。)

以上是关于<链表C ++中结构成员的运算符重载的主要内容,如果未能解决你的问题,请参考以下文章

求C语言 数据结构中的链表创建,插入和删除代码

关于C语言结构体构造函数初始化的问题?

c语言:通过指向结构体变量的指针变量输出结构体变量中成员的信息

如何在C ++中创建循环内的结构成员

c语言 双向链表的简单操作-创建插入删除

C语言中的(uint32)1<<10 是啥意思?