Оператор перегрузки [] с контейнером списка - PullRequest
0 голосов
/ 13 декабря 2011

Я работаю над программой, в которой я практикую использование шаблонных классов для написания связанного списка с контейнером списка за кулисами, выполняющим большинство операций:

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 ++ и точно не знаю, как лучше всего подойти к этой проблеме есть.

1 Ответ

2 голосов
/ 13 декабря 2011

Насколько я могу судить, ваш код пытается сделать простую вещь удивительно сложным способом. Что не так с просто:

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 - размер списка). Если вам нужен произвольный доступ к элементам списка, массив с изменяемым размером будет гораздо лучшей структурой данных.

...