Russian Qt Forum
Ноябрь 23, 2024, 23:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QLinkedList  (Прочитано 12456 раз)
coll3ctor
Гость
« : Март 16, 2011, 21:12 »

опишите пожалуйста основные принципы работы с ним.

Понимаю что через <> можно передать параметр, в узлах которого будет он хранится. Теперь вопрос: при вызове конструктора
QLinkedList<T> list1(); - создаётся пусто список с первым узлом и указателем на NULL или как ?
Записан
serg_hd
Хакер
*****
Offline Offline

Сообщений: 668



Просмотр профиля
« Ответ #1 : Март 16, 2011, 22:40 »

Это, видимо, аналог std::list<T>, в ассистенте всё доступно и с примерами описано. Условно "T" - это любой заданный тобою тип: QString, int, char, MyType и т.п. Поэтому так "QLinkedList<T> list1()" создавать его не надо, если, конечно, T - не название одного из твоих классов.
Код
C++ (Qt)
QLinkedList<QString> list;
list << "one" << "two" << "three";
// list: ["one", "two", "three"]
 
В "<>" указываешь хранимый в связном списке тип, сам класс списка организован как шаблонный, что почти закон для подобных вещей.
Записан

kubuntu/Win7/x64/NetBeans
coll3ctor
Гость
« Ответ #2 : Март 17, 2011, 08:09 »

Это, видимо, аналог std::list<T>, в ассистенте всё доступно и с примерами описано. Условно "T" - это любой заданный тобою тип: QString, int, char, MyType и т.п. Поэтому так "QLinkedList<T> list1()" создавать его не надо, если, конечно, T - не название одного из твоих классов.
Код
C++ (Qt)
QLinkedList<QString> list;
list << "one" << "two" << "three";
// list: ["one", "two", "three"]
 
В "<>" указываешь хранимый в связном списке тип, сам класс списка организован как шаблонный, что почти закон для подобных вещей.

это-то я уж понимаю Улыбающийся
Код
C++ (Qt)
QLinkedList<QString> list;
list << "one" << "two" << "three";
// list: ["one", "two", "three"]
 
при этой записи создастся список с 3 узлами, верно ?
Записан
SimpleSunny
Гость
« Ответ #3 : Март 17, 2011, 09:39 »

да
Записан
coll3ctor
Гость
« Ответ #4 : Март 17, 2011, 10:51 »

да

но там QString. Вот я пишу:

Код:
Kitap p1("Ivanov", "C_P_P", 1999, "EXMO", 16);
QLinkedList<Kitap> list1;

Создался связный список. как мне создать узлы и заполнить их ? В Доке читал - про это там нету...

зы

Код:
class Kitap
{
public:
    QString authorName;
QString bookName;
int year;
QString publishingHouse;
int requestCount;


Kitap();
Kitap(QString, QString, int, QString, int);
~Kitap();
};
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Март 17, 2011, 10:55 »

void QLinkedList::append ( const T & value )
void QLinkedList::push_back ( const T & value )
void QLinkedList::push_front ( const T & value )

Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Март 17, 2011, 13:05 »

1) "Связный список" есть "масло масляное", т.к. не существует "несвязных" списков.
2) "Узел" обычно используется для дерева, для списка этот термин смысла не имеет
3) Не лучше ли сначала сделать простенький список самому на С/С++ ? Например

Код
C++ (Qt)
class Kitap
{
public:
   QString authorName;
   Kitap * mNext;
 
   static Kitap * mListHead, * mListTail;
 
   void Link2ListHead( void )
   {
     mNext = mListHead;
     mListHead = this;
     if (!mListTail)
      mListTail = this;
   }
 
   void Link2ListTail( void )
   {
     mNext = 0;
     if (mListTail)
      mListTail->mNext = this;
     mListTail = this;
     if (!mListHead)
      mListHead = this;
   }
 
   static void DeleteAll( void )
   {
     Kitap * cur = mListHead;
     while (cur) {
       Kitap * next = cur->mNext;
       delete cur;
       cur = next;
     }
     mListHead = mListTail = 0;
   }
};
 
Изучение готовых классов хорошо если Вы уже умеете так делать и Вам это уже неинтересно. А иначе можно оказаться в положении "обезьяны без кармана" знающей классы  Улыбающийся
Записан
coll3ctor
Гость
« Ответ #7 : Март 17, 2011, 21:46 »

1) "Связный список" есть "масло масляное", т.к. не существует "несвязных" списков.
2) "Узел" обычно используется для дерева, для списка этот термин смысла не имеет
3) Не лучше ли сначала сделать простенький список самому на С/С++ ? Например

Код
C++ (Qt)
class Kitap
{
public:
   QString authorName;
   Kitap * mNext;
 
   static Kitap * mListHead, * mListTail;
 
   void Link2ListHead( void )
   {
     mNext = mListHead;
     mListHead = this;
     if (!mListTail)
      mListTail = this;
   }
 
   void Link2ListTail( void )
   {
     mNext = 0;
     if (mListTail)
      mListTail->mNext = this;
     mListTail = this;
     if (!mListHead)
      mListHead = this;
   }
 
   static void DeleteAll( void )
   {
     Kitap * cur = mListHead;
     while (cur) {
       Kitap * next = cur->mNext;
       delete cur;
       cur = next;
     }
     mListHead = mListTail = 0;
   }
};
 
Изучение готовых классов хорошо если Вы уже умеете так делать и Вам это уже неинтересно. А иначе можно оказаться в положении "обезьяны без кармана" знающей классы  Улыбающийся

как раз подумывал об этом, и мне это тоже советовали Улыбающийся

тут как раз проблема возникает: я создаю объект своего класса (Kitap), последовательно создаю (к примеру) 3 узла. Засовываю в узлы свои объекты (сорри за узлы, привык уж), и выясняется, что чтобы заполнить таблицу полями из узлов я должен обращаться к полям своего класса. То есть вытащить поля из узла я не могу => пропадает смысл задания, которое мне дано на семестр...

зы

класс связного списка я уже реализовывал, ещё в позапрошлом семестре в консольной форме. если моя реализация класса списка поможет решить проблему (вышеизложенную), тогда я последую вашему совету. что скажете ?
« Последнее редактирование: Март 17, 2011, 21:48 от coll3ctor » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Март 17, 2011, 23:02 »

..и выясняется, что чтобы заполнить таблицу полями из узлов я должен обращаться к полям своего класса. То есть вытащить поля из узла я не могу => пропадает смысл задания, которое мне дано на семестр...
Ну если Вы делали, то знаете что список предназначен для последовательного перебора, элемент за элементом. Напр для примера выше

Код
C++ (Qt)
void FillTable( void )
{
int row = 0;
KitMap * kit = Kitmap::mListHead; // встали на первый элемент списка
while (kit) {
 table.setText(kit->authorName, row++); // используем поля kit для заполнения или еще чего-то
 ...
 kit = kit->mNext;   // теперь kit указывает уже на следующий элемент списка
}
}
 
То же самое с QLinkedList, только через итераторы (begin() и.т.п) 
Записан
coll3ctor
Гость
« Ответ #9 : Апрель 05, 2011, 20:59 »

какой ф-й добавлять новый узел в список?

если insert, то первый аргумент как задать для нужного мне места?
Записан
alexman
Гость
« Ответ #10 : Апрель 05, 2011, 22:44 »

list.insert( list.begin() + i, t );
Записан
coll3ctor
Гость
« Ответ #11 : Апрель 07, 2011, 11:37 »

list.insert( list.begin() + i, t );

а удалить как? list.remove(T) - не пойму как ей пользоваться.в цикле итератора по номеру определить нужный элемент, сравнить его и удалить чтоли?
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #12 : Апрель 07, 2011, 12:20 »

Цитировать
а удалить как? list.remove(T) - не пойму как ей пользоваться.в цикле итератора по номеру определить нужный элемент, сравнить его и удалить чтоли?
У QLinkedList нет такого метода remove.*
Есть removeFirts, removeLast, removeOne и removeAll.

*Вру, есть оказывается просто remove..

offtop
А почему название класса Kitap, а не Book? Ведь все поля у вас на английском, а название самого класса на татарском?
« Последнее редактирование: Апрель 07, 2011, 12:24 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Апрель 07, 2011, 13:01 »

а удалить как? list.remove(T) - не пойму как ей пользоваться.в цикле итератора по номеру определить нужный элемент, сравнить его и удалить чтоли?
Хотя прогресс есть ("итератор" и уже "элемент" вместо "узел"), посты все равно производят гнетущее впечатление. Ну зачем (из-под палки) заниматься тем к чему душа явно не лежит?  Наймите кого-нибудь вместо того чтобы мучать кошку  Плачущий
Записан
coll3ctor
Гость
« Ответ #14 : Апрель 07, 2011, 23:21 »

Цитировать
а удалить как? list.remove(T) - не пойму как ей пользоваться.в цикле итератора по номеру определить нужный элемент, сравнить его и удалить чтоли?
У QLinkedList нет такого метода remove.*
Есть removeFirts, removeLast, removeOne и removeAll.

*Вру, есть оказывается просто remove..

offtop
А почему название класса Kitap, а не Book? Ведь все поля у вас на английском, а название самого класса на татарском?

просто Улыбающийся я мог назвать его и Soplya. Неравнозначно )
так как удалить?) в итоге я сделал через метод erase ...
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.341 секунд. Запросов: 22.