我正在编写一个程序,在这个程序中,我练习使用模板类来编写一个链表,其中列表容器在幕后执行大部分操作:
template <typename T>
class LinkedList
{
public:
void add(const T& t) {
q.push_front(t);
}
T pop() {
T t = q.front();
q.pop_front();
return t;
}
T& operator[](int i);
private:
list<T> q;
};
现在我想实现[]
操作符,这样我就可以创建一个LinkedList
对象,然后执行如下操作:
list1[0] = 1;
目前,我有:
template <typename T>
T& LinkedList<T>::operator[](int i)
{
LinkedList<T> tempList;
int j;
T* getNode;
for(j = 0; j < (i + 1); j++) {
T* currentNode = pop();
tempList.add(currentNode);
if(j == i) {
getNode = currentNode;
}
}
while(tempList.isEmpty == false) {
add(tempList.pop());
}
return *getNode;
}
这显然不起作用,这是因为我不知何故弄乱了我想要的特定元素的引用并返回它,但我是c++的新手,我不完全知道解决这个问题的最佳方法是什么。
据我所知,您的代码试图以一种非常复杂的方式做一件简单的事情。只是:
有什么不对?template <typename T>
T& LinkedList<T>::operator[](int i)
{
assert(i >= 0 && i < q.size());
typename list<T>::iterator it(q.begin());
std::advance(it, i);
return *it;
}
然而,我不明白为什么你想要这个操作。此操作的时间复杂度为O(N)(其中N为列表的大小)。如果您希望随机访问列表中的元素,可调整大小的数组将是更好的数据结构。