Название: 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.
|