Russian Qt Forum

Qt => Общие вопросы => Тема начата: pakulo от Июль 11, 2007, 14:49



Название: QList, last()
Отправлено: pakulo от Июль 11, 2007, 14:49
Меня интересует такой вопрос...
В списке QList хранится указатель на первый и последний элемент ?
Т.е. если я вызываю last() то оно не пробегает по всему списку что вервуть последний элемент?


Название: QList, last()
Отправлено: SABROG от Июль 11, 2007, 14:50
Нет конечно :) Ведь в листе содержится информация о количестве элементов. Значит конец это QList[QList.size()-1]


Название: QList, last()
Отправлено: pakulo от Июль 11, 2007, 14:58
А как тогда сохраняются элементы в списке? Ведь это динмаческий список...
Я вот что-то думал что QList хранит элементы сохраняя указатель на следующий элемент и на начало списка...

>>Значит конец это QList[QList.size()-1]
Ведь что бы получить обьект таким образом, нужно пройтись по всему списку?


Название: QList, last()
Отправлено: SABROG от Июль 11, 2007, 15:02
Цитата: "pakulo"
А как тогда сохраняются элементы в списке? Ведь это динмаческий список...
Я вот что-то думал что QList хранит элементы сохраняя указатель на следующий элемент и на начало списка...

>>Значит конец это QList[QList.size()-1]
Ведь что бы получить обьект таким образом, нужно пройтись по всему списку?


Зачем ? Когда ты объявляешь QList ты указываешь тип данных которые будут в нем храниться, т.е. QList уже знает сколько байт занимает один элемент данных. Он знает сколько данных у него есть. Значит операцией умножения размера одного элемента на нужных индекс ты получаешь сразу же область памяти по которой находится элемент с твоим индексом.
Т.е. если у тебя элементов на 4Гб QList просто производит арифмитическую операцию с указателем.


Название: QList, last()
Отправлено: Racheengel от Июль 11, 2007, 15:17
Вообще то QList не размещает данные в сплошном участке памяти.
Так делает QVector.
Скорее QList просто хранит указатели на 1 и послений элементы, и каждый элемент хранит указатель на предыдущий и следующий.
Так что, чтобы достать элемент №100, он пробежит по всем 99 предыдущим.
Для произвольного доступа желательно юзать QVector.


Название: QList, last()
Отправлено: SABROG от Июль 11, 2007, 15:47
Цитировать

For most purposes, QList is the right class to use. Its index-based API is more convenient than QLinkedList's iterator-based API, and it is usually faster than QVector because of the way it stores its items in memory. It also expands to less code in your executable.


Название: QList, last()
Отправлено: pastor от Июль 11, 2007, 15:53
QList это тотже QVector только с быстрой вставкой в начало О(1).

Читаем в ассистанте Generic Containers


Название: QList, last()
Отправлено: Racheengel от Июль 11, 2007, 16:16
Про вектор:

QVector<T> is one of Qt's generic container classes. It stores its items in adjacent memory locations and provides fast index-based access.

If you want the items to occupy adjacent memory positions, use QVector.

In addition to QVector, Qt also provides QVarLengthArray, a very low-level class with little functionality that is optimized for speed


Название: QList, last()
Отправлено: SABROG от Июль 11, 2007, 16:26
Значит я ошибся.

У меня в программе создано около двух десяткой QVariantList (QList<QVariant>), один из них содержит около 200000 записей. Может лучше мне выбрать что-то другое, чтобы быстро заносить данные в массив ? Правда тогда мне придется переписать логику программы и отказаться от bindа в SQL.


Название: QList, last()
Отправлено: Sergeich от Июль 11, 2007, 16:45
Господа, почитывайте Qt Quarterly ;) http://doc.trolltech.com/qq/qq19-containers.html Оно сеет доброе, разумное, вечное.  :D


Название: QList, last()
Отправлено: SABROG от Июль 11, 2007, 16:49
Цитата: "Sergeich"
Господа, почитывайте Qt Quarterly ;) http://doc.trolltech.com/qq/qq19-containers.html Оно сеет доброе, разумное, вечное.  :D


Там написано, что begin и end храняться отдельно в QList'e :)


Название: QList, last()
Отправлено: pastor от Июль 11, 2007, 16:53
Цитата: "SABROG"
Значит я ошибся.

У меня в программе создано около двух десяткой QVariantList (QList<QVariant>), один из них содержит около 200000 записей. Может лучше мне выбрать что-то другое, чтобы быстро заносить данные в массив ? Правда тогда мне придется переписать логику программы и отказаться от bindа в SQL.


Все зависит от того, что ты делаешь с этим набором данных. Если отсутствует вставка(удаление) в(из) середину(ы) - QVector, QList, если напротив - QLinkedList. Читаем ассистант, там все написано. Конкретно вот раздел Algorithmic Complexity в котором сравниваеться производительность контейноров Qt


Название: QList, last()
Отправлено: SABROG от Июль 11, 2007, 16:54
Не, у меня просто парсится XML и данные последовательно через append кладутся в QList, после заполнения этот QList передается на Bind который собственно и заносит данные в базу данных.


Название: QList, last()
Отправлено: pastor от Июль 11, 2007, 17:12
Если выполняется добавление элеменотов в конец, QVector'а тебе с головой хватит. Если извесно кол-во записей, можешь сделать вектору resize(<кол-во записей>) и обращаться к элементам последовательно по индексу. Так будет быстрее, чем делать 200000 раз append


Название: QList, last()
Отправлено: SABROG от Июль 11, 2007, 17:17
Количество записей не извесно, можно конечно сделать их извесным пройдясь по всему XMLю, но потом придется проходить еще раз по нему от начала. А QVector вообще как-то совместим с типом QList ? Я использу addBindValue класса QSqlQuery для передачи QVariantList (QList<QVariant>).


Название: QList, last()
Отправлено: pastor от Июль 11, 2007, 17:53
Испоьзуй тогда QList, большой разницы нет между ним и QVector.


Название: QList, last()
Отправлено: pakulo от Июль 11, 2007, 21:47
Sergeich, спасибо за ссылочку. Это то что я хотел узнать...


Название: QList, last()
Отправлено: Racheengel от Июль 11, 2007, 22:53
если кол-во записей не известно и доступ к ним в принципе не произвольный, а по очереди, то конечно QList.