Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.79
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
#1

Реализовать двунаправленный список в духе списка из STL - C++

11.02.2011, 20:37. Просмотров 4322. Ответов 44
Метки нет (Все метки)

Все-таки видимо у меня всегда останутся с этим проблемы.
Само определение скидывать не буду, я пытаюсь сделать, что-то вроде STL-ного списка.
Спросить хочу только одно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    void push_back(const T& el)
    {
        Node* tmp=new Node(el);
        if(empty())
        {
            head=tmp;
            tail=tmp;
            ++sz;
            return;
        }
        tail->next=tmp;
        tail=tmp;
        ++sz;
    }
После этого список можно прогонять только в одну сторону. С головы в хвост. В хвосте же только последний элемент и в prev ничего нет. В чем мб проблема?
Хотя вообще как я понял это для однонаправленного только катит... А вот как сделать для двунаправленного - второй день догнать не могу.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2011, 20:37     Реализовать двунаправленный список в духе списка из STL
Посмотрите здесь:

C++ двунаправленный список
Двунаправленный список C++
Двунаправленный список C++
C++ двунаправленный список.
Реализовать двухсвязный список. Каждый элемент списка может содержать один объект C++
Двунаправленный список (добавление/удаление элементов в голову, просмотр списка, реализовать дублирование элементов с заданным значением) C++
C++ двунаправленный список
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
16.04.2011, 09:37  [ТС]     Реализовать двунаправленный список в духе списка из STL #41
bigredcat, Про наследование.

Итераторы в list MSVS.

C++
1
2
3
    template <bool _SECURE_VALIDATION>
    class _Iterator
        : public _Const_iterator<_SECURE_VALIDATION>
bigredcat
364 / 311 / 3
Регистрация: 24.02.2011
Сообщений: 1,512
Записей в блоге: 1
16.04.2011, 11:31     Реализовать двунаправленный список в духе списка из STL #42
ForEveR, да, это так. Но в отличае от вашей реализации, там наследование имеет смысл. В MSVC в производном классе итератора поле для хранения указателя на узел не определяется заново (по крайней мере то, что я видел в STL VC2008). Это поле уже есть в базовом классе. Зачем его еще в производный добавлять?
Я хочу сказать, что поскольку в вашей реализации все поля переопределяются в производном классе заново, то и смысл наследования теряется. Это при том еще, что базовый класс практически ничего больше, в добавление к этим указателям, не содержит, кроме операторов, которые все-равно требуется переопределить в производном.
Кроме того не совсем понятно зачем хранить еще два указателя, если предыдущий и следующий могут быть получены из текущего. Спасти от неопределенного состояния итератора в случае удаления текущего узла они все-равно в общем случае не могут, так как могут быть удалены и соседние узлы. Так что одного указателя в базовом классе вполне достаточно.
zarko97
249 / 30 / 0
Регистрация: 11.10.2015
Сообщений: 183
24.08.2016, 18:07     Реализовать двунаправленный список в духе списка из STL #43
ещё можно добавить
C++
1
2
3
List(std::initializer_list<value_type> l) : List(l.begin(), l.end())
{
}
HelicopterK52
649 / 192 / 28
Регистрация: 27.07.2016
Сообщений: 475
Завершенные тесты: 1
24.08.2016, 18:09     Реализовать двунаправленный список в духе списка из STL #44
Цитата Сообщение от zarko97 Посмотреть сообщение
ещё можно добавить
Особенно, если учесть, что тема создана до выхода C++11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2016, 18:18     Реализовать двунаправленный список в духе списка из STL
Еще ссылки по теме:

Создать базовый класс список. Реализовать на базе списка стек и очередь с виртуальными функциями вставки и вытаскивания C++
C++ Двунаправленный список
C++ Реализовать удаление элемента из пользовательского класса "Двунаправленный список"

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
zarko97
249 / 30 / 0
Регистрация: 11.10.2015
Сообщений: 183
24.08.2016, 18:18     Реализовать двунаправленный список в духе списка из STL #45
ну на дату особо не смотрю...
+недостает

C++
1
2
3
4
5
6
7
8
9
10
11
template <class T>
inline bool operator==(const list<T> &x, const list<T> &y)
{
    return x.size() == y.size() && std::equal(x.begin(), x.end(), y.begin());
}
 
template <class T>
inline bool operator< (const list<T> &x, const list<T> &y)
{
    return std::lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());
}
и тд.

Добавлено через 1 минуту
+ неплохо перегрузить >> и <<
Yandex
Объявления
24.08.2016, 18:18     Реализовать двунаправленный список в духе списка из STL
Ответ Создать тему
Опции темы

Текущее время: 10:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru