用列表容器重载[]操作符



我正在编写一个程序,在这个程序中,我练习使用模板类来编写一个链表,其中列表容器在幕后执行大部分操作:

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为列表的大小)。如果您希望随机访问列表中的元素,可调整大小的数组将是更好的数据结构。

相关内容

  • 没有找到相关文章

最新更新