Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;链表:重载括号运算符[]_C++_Data Structures_Operator Overloading_Linked List_Square Bracket - Fatal编程技术网

C++ C++;链表:重载括号运算符[]

C++ C++;链表:重载括号运算符[],c++,data-structures,operator-overloading,linked-list,square-bracket,C++,Data Structures,Operator Overloading,Linked List,Square Bracket,因此,我决定回顾一些数据结构,以保持敏锐的洞察力;) 我开始实现一个哈希表,当时我记得我需要为存储桶创建链表,这样我就可以避免哈希冲突。所以我开始了我的链接列表 我实现了我的链表类的所有函数方法(add、get、remove等),然后我决定尝试一些以前从未尝试过的方法。重载数组索引运算符,以便可以检索或分配我的链表索引,就像链表是数组一样 我让检索部分正常工作没有问题: template <class T> T LinkedList<T>::operator[](cons

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

我开始实现一个哈希表,当时我记得我需要为存储桶创建链表,这样我就可以避免哈希冲突。所以我开始了我的链接列表

我实现了我的链表类的所有函数方法(add、get、remove等),然后我决定尝试一些以前从未尝试过的方法。重载数组索引运算符,以便可以检索或分配我的链表索引,就像链表是数组一样

我让检索部分正常工作没有问题:

template <class T>
T LinkedList<T>::operator[](const int &i) {
    return get(i);
}
模板
T LinkedList::运算符[](常量int&i){
返回获取(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
LinkedList列表;
列表[0]=1//为第0个节点分配内存,并将1存储为数据
列表[3]=2//为第1、第2和第3个节点分配内存,并将2设置为数据
//未分配的节点应在数据上使用默认构造函数
int a=列表[3]//将a设置为2

cout看起来您希望通过引用返回节点:

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); }
...
};
模板
类链接列表{
...
T&运算符[](const size_T&i){返回此->获取(i);}
常量T和运算符[](常量大小_T&i)常量{返回此->获取(i);}
...
};

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

运算符[]
get()
应返回对数据的引用

template <class T>
T& LinkedList<T>::operator[](const int &i) {
    return get(i);
}
模板
T&LinkedList::运算符[](常量int&i){
返回获取(i);
}

由于getter函数必须作为迭代实现,因此添加setter似乎很简单。然而,我认为这个界面使用起来会很笨拙。在上面的示例中,冲突列表的预期大小是多少?我(作为用户)如何知道两个项目[1,2]是“空的”?您打算如何在删除时保持关联性,正弦恒定时间删除是链表的主要优点之一?
const size\u t&i
没有多大意义,因为它不是必需的<代码>大小\u ti
就足够了。@Nawaz const ref也足够了。这对我来说很有意义,这是我的默认值,而不是价值。@Justin:我认为这太过分了。或者你认为它让调用更快?“纳瓦兹,我这样做是因为它与我的代码的其余部分一致。”纳瓦兹通过const引用传递参数是我编写的C++程序和库中的默认约定。如果有充分的理由在特定情况下背离公约,我会这样做。