Russian Qt Forum

Qt => Общие вопросы => Тема начата: coll3ctor от Март 16, 2011, 21:12



Название: QLinkedList
Отправлено: coll3ctor от Март 16, 2011, 21:12
опишите пожалуйста основные принципы работы с ним.

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


Название: Re: QLinkedList
Отправлено: serg_hd от Март 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"]
 
В "<>" указываешь хранимый в связном списке тип, сам класс списка организован как шаблонный, что почти закон для подобных вещей.


Название: Re: QLinkedList
Отправлено: coll3ctor от Март 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 узлами, верно ?


Название: Re: QLinkedList
Отправлено: SimpleSunny от Март 17, 2011, 09:39
да


Название: Re: QLinkedList
Отправлено: coll3ctor от Март 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();
};


Название: Re: QLinkedList
Отправлено: Пантер от Март 17, 2011, 10:55
void QLinkedList::append ( const T & value )
void QLinkedList::push_back ( const T & value )
void QLinkedList::push_front ( const T & value )



Название: Re: QLinkedList
Отправлено: Igors от Март 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;
   }
};
 
Изучение готовых классов хорошо если Вы уже умеете так делать и Вам это уже неинтересно. А иначе можно оказаться в положении "обезьяны без кармана" знающей классы  :)


Название: Re: QLinkedList
Отправлено: coll3ctor от Март 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 узла. Засовываю в узлы свои объекты (сорри за узлы, привык уж), и выясняется, что чтобы заполнить таблицу полями из узлов я должен обращаться к полям своего класса. То есть вытащить поля из узла я не могу => пропадает смысл задания, которое мне дано на семестр...

зы

класс связного списка я уже реализовывал, ещё в позапрошлом семестре в консольной форме. если моя реализация класса списка поможет решить проблему (вышеизложенную), тогда я последую вашему совету. что скажете ?


Название: Re: QLinkedList
Отправлено: Igors от Март 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() и.т.п) 


Название: Re: QLinkedList
Отправлено: coll3ctor от Апрель 05, 2011, 20:59
какой ф-й добавлять новый узел в список?

если insert, то первый аргумент как задать для нужного мне места?


Название: Re: QLinkedList
Отправлено: alexman от Апрель 05, 2011, 22:44
list.insert( list.begin() + i, t );


Название: Re: QLinkedList
Отправлено: coll3ctor от Апрель 07, 2011, 11:37
list.insert( list.begin() + i, t );

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


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

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

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


Название: Re: QLinkedList
Отправлено: Igors от Апрель 07, 2011, 13:01
а удалить как? list.remove(T) - не пойму как ей пользоваться.в цикле итератора по номеру определить нужный элемент, сравнить его и удалить чтоли?
Хотя прогресс есть ("итератор" и уже "элемент" вместо "узел"), посты все равно производят гнетущее впечатление. Ну зачем (из-под палки) заниматься тем к чему душа явно не лежит?  Наймите кого-нибудь вместо того чтобы мучать кошку  :'(


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

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

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

просто :) я мог назвать его и Soplya. Неравнозначно )
так как удалить?) в итоге я сделал через метод erase ...


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

это намёк?)

у меня это семестровое задание по ооп :) вот и делаю.2 курс, рановато ещё нанимать  :)


Название: Re: QLinkedList
Отправлено: Авварон от Апрель 07, 2011, 23:30
БТВ, я на 2м курсе тоже тупой был


Название: Re: QLinkedList
Отправлено: Пантер от Апрель 08, 2011, 07:19
Потом наточили?  ;D


Название: Re: QLinkedList
Отправлено: coll3ctor от Апрель 13, 2011, 08:11
Теперь мне нужно загрузить список из файла :) в файл записывать у меня получилось, благодаря примерам ассистанта, а вот загрузить его из файла проблематично... компилятор ругается на
Код:
in >> list;
, хотя такая перегрузка присутствует. вот исходник ф-ии:

Код:
void artur :: openButton()
{
QString fileName = QFileDialog::getOpenFileName(this,
tr("Open list"), "",
tr("Kitap (*.ktp);;All Files (*)"));

if (fileName.isEmpty())
return;
else {

QFile file(fileName);

if (!file.open(QIODevice::ReadOnly)) {
QMessageBox::information(this, tr("Unable to open file"),
file.errorString());
return;
}

QDataStream in(&file);
in.setVersion(QDataStream::Qt_4_5);
list.empty();   // очистка существующих контактов
//list.clear();

/*QLinkedList<Kitap>::iterator listIterator   =  list.begin();
QLinkedList<Kitap>::iterator end            =  list.end();

for( ; listIterator != end; listIterator++)
{
Kitap currentData  = *listIterator;

in >> currentData.authorName;

in >> currentData.bookName;

in >> currentData.year;

in >> currentData.publishingHouse;

in >>  currentData.requestCount;
}*/

in >> list;


if (list.isEmpty()) {
QMessageBox::information(this, tr("No elements in file"),
tr("The file you are attempting to open contains no kitap."));
} else {
//very very strong
QLinkedList<Kitap>::iterator listIterator   =  list.begin();
QLinkedList<Kitap>::iterator end            =  list.end();

int j = 0;

for( ; listIterator != end; listIterator++)
{

Kitap currentData  = *listIterator;

QTableWidgetItem * newda1 = new QTableWidgetItem(currentData.authorName);
ui.tableWidget->setItem(j,0,newda1);

QTableWidgetItem * newda2 = new QTableWidgetItem(currentData.bookName);
ui.tableWidget->setItem(j,1,newda2);

QTableWidgetItem * newda3 = new QTableWidgetItem(currentData.year);
newda3->setData(Qt::DisplayRole,currentData.year);
ui.tableWidget->setItem(j,2,newda3);

QTableWidgetItem * newda4 = new QTableWidgetItem(currentData.publishingHouse);
ui.tableWidget->setItem(j,3,newda4);

QTableWidgetItem * newda5 = new QTableWidgetItem(currentData.requestCount);
newda5->setData(Qt::DisplayRole,currentData.requestCount);
ui.tableWidget->setItem(j,4,newda5);

j++;
}

// da da
}
}


}


Название: Re: QLinkedList
Отправлено: alexman от Апрель 13, 2011, 08:34
Покажи как переопределил?


Название: Re: QLinkedList
Отправлено: coll3ctor от Апрель 13, 2011, 09:14
Покажи как переопределил?

что переопределил?)

я имел ввиду в классе QLinkedList присутствует перезгрузки:

Код:
QDataStream & operator<< ( QDataStream & out, const QLinkedList<T> & list )

QDataStream & operator>> ( QDataStream & in, QLinkedList<T> & list )

или их нужно переопределять под свой контейнерный тип данных ? глупо как то...


Название: Re: QLinkedList
Отправлено: coll3ctor от Апрель 17, 2011, 09:15
Покажи как переопределил?

что переопределил?)

я имел ввиду в классе QLinkedList присутствует перезгрузки:

Код:
QDataStream & operator<< ( QDataStream & out, const QLinkedList<T> & list )

QDataStream & operator>> ( QDataStream & in, QLinkedList<T> & list )

или их нужно переопределять под свой контейнерный тип данных ? глупо как то...


с этим разобарался.перегрузил для своего класса эти операторы и всё заработало.

Следующий вопрос: мне нужно по критериям из полей элементов списка вывести (согласно критериям) соответствующие элементы. кто-нить подскажите пожалуйста примерный алгоритм на это...