【问题标题】:C++ Linked List: Overload bracket operators []C++ 链表:重载括号运算符 []
【发布时间】:2011-12-03 10:27:21
【问题描述】:

因此,我决定回顾一些数据结构以保持敏锐;)

我开始实现哈希表,当我记得我需要桶的链表以避免哈希冲突时。所以我开始了我的链表...

我实现了我的链表类的所有功能方法(添加、获取、删除等),然后我决定尝试一些我以前没有尝试过的东西。重载数组索引运算符,以便可以检索或分配我的链表索引,就像链表是一个数组一样。

我的检索部分工作没问题:

template <class T>
T LinkedList<T>::operator[](const int &i) {
    return get(i);
}

get 函数返回关联节点的数据,而不是节点本身...setter 应该在提供的值存储到给定索引处节点的数据属性的地方表现...我的愿景是用户永远不必接触 ListNode 类。

我的最终目标是我可以拥有一个智能的 LinkedList,其行为如下:

LinkedList<int> list;

list[0] = 1;    //Allocates memory for 0th node and stores 1 as the data
list[3] = 2;    //Allocates memory for 1th,2th,and 3th nodes and sets 2 as the data
                //Unassigned nodes should use default constructors on data

int a = list[3];  //Sets a to 2
cout << list[0] << endl;  //prints 1

getter 工作正常,但我在 setter 上遇到问题。假设所有索引错误检查和内存分配的 set 函数按原样完成。任何帮助,将不胜感激。如果不可能,请在我花更多时间之前告诉我。谢谢。

【问题讨论】:

  • 由于 getter 函数必须实现为迭代,添加 setter 似乎微不足道。然而,我认为这个界面使用起来会很笨拙。在上面的示例中,碰撞列表的预期size 是什么?我(作为用户)如何知道两个项目 [1,2] 是“空的”?如何计划在删除时保持关联性,正弦常数时间删除是链表的主要好处之一?

标签: c++ data-structures operator-overloading linked-list square-bracket


【解决方案1】:

看起来你想通过引用返回节点:

template <typename T>
class LinkedList {
...
  T& operator[](const size_t& i) { return this->get(i); }
  const T& operator[](const size_t& i) const { return this->get(i); }
...
};

(也假设 LinkedList::get() 返回引用)

【讨论】:

  • const size_t&amp; i 没有多大意义,因为它不是必需的。 size_t i 就够了。
  • @Nawaz const ref 也足够了。对我来说,它是 my 默认值,而不是值。
  • @Justin:我认为这太过分了。或者您认为它可以加快通话速度?
  • @Nawaz 我这样做是因为它与我的其余代码一致。
  • @Nawaz 通过 const 引用传递参数是我编写的 c++ 程序和库中的默认约定。如果在特定情况下有充分的理由偏离约定,我会这样做。
【解决方案2】:

operator[]get() 应该返回对数据的引用。

template <class T>
T& LinkedList<T>::operator[](const int &i) {
    return get(i);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-15
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多