【问题标题】:How to make a function to adress doubly linked list node?如何制作一个函数来寻址双向链表节点?
【发布时间】:2021-01-26 16:32:11
【问题描述】:

我在 C++ 中实现了双向链表作为类

在 main.cpp 中,我将其他类的对象推送到此列表中,如下所示

list.insertBack(ClassA(name, description));

但是在那之后我需要改变这个对象的某个字段,例如执行一个改变人口的方法。为此,我需要以某种方式从列表中处理该对象,就像我对常规数组所做的那样(例如a[i])。为此,我的 List 类中需要一个特殊的方法/函数。我该如何实现?

【问题讨论】:

  • 当然,你可以为你的 List 类实现operator[]。它会在后台使用find 吗?如果是这样,如果find返回nullptr,你会怎么做?

标签: c++ class oop templates doubly-linked-list


【解决方案1】:

您只需为您的班级提供operator[]

template<class T>
class List {

    // your private interface

public:

    // your other public interface 

    T& operator[](unsigned int i)
    {
        Node* n = this->head;
        for (; i>0; --i)
        {
            n = n->next;
        }
        return n->data;
    }
};

在您的主目录中,您可以像这样简单地使用它

int main() {
    List<double> l;
    l.insertBack(0.0);
    l.insertBack(1.0);
    l.insertBack(2.0);
    l.insertBack(3.0);

    std::cout <<  l[2] << std::endl;
}

请注意,您可能还需要此函数的const 版本。这是demo

注意:正如@Botje 所指出的,您可能还需要对输入进行一些完整性检查。如果 i 等于或大于现有节点的数量,我的代码 sn-p 会取消引用 nullptr 并且您会得到未定义的行为。

【讨论】:

  • 如果i 大于列表中的节点数会怎样?
  • @Botje 感谢您指出这一点。然后我取消引用nullptr,这将导致未定义的行为。就像std::vector::operator[] 一样,我这里没有做任何检查。
  • 谢谢!如何将它与 City 类的方法一起使用?例如我想做list[2].event(),看起来像这样void City::event() { cout &lt;&lt; "Special event happening in city" &lt;&lt; this-&gt;name &lt;&lt; endl; }
  • @kekundel 我更新了答案。它现在返回T&amp;。在您的情况下,您将获得对 City 对象的引用。
猜你喜欢
  • 2022-12-09
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 2014-10-13
  • 1970-01-01
  • 1970-01-01
  • 2016-11-05
相关资源
最近更新 更多