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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QList, last()  (Прочитано 12689 раз)
pakulo
Гость
« : Июль 11, 2007, 14:49 »

Меня интересует такой вопрос...
В списке QList хранится указатель на первый и последний элемент ?
Т.е. если я вызываю last() то оно не пробегает по всему списку что вервуть последний элемент?
Записан
SABROG
Гость
« Ответ #1 : Июль 11, 2007, 14:50 »

Нет конечно Улыбающийся Ведь в листе содержится информация о количестве элементов. Значит конец это QList[QList.size()-1]
Записан
pakulo
Гость
« Ответ #2 : Июль 11, 2007, 14:58 »

А как тогда сохраняются элементы в списке? Ведь это динмаческий список...
Я вот что-то думал что QList хранит элементы сохраняя указатель на следующий элемент и на начало списка...

>>Значит конец это QList[QList.size()-1]
Ведь что бы получить обьект таким образом, нужно пройтись по всему списку?
Записан
SABROG
Гость
« Ответ #3 : Июль 11, 2007, 15:02 »

Цитата: "pakulo"
А как тогда сохраняются элементы в списке? Ведь это динмаческий список...
Я вот что-то думал что QList хранит элементы сохраняя указатель на следующий элемент и на начало списка...

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


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

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #4 : Июль 11, 2007, 15:17 »

Вообще то QList не размещает данные в сплошном участке памяти.
Так делает QVector.
Скорее QList просто хранит указатели на 1 и послений элементы, и каждый элемент хранит указатель на предыдущий и следующий.
Так что, чтобы достать элемент №100, он пробежит по всем 99 предыдущим.
Для произвольного доступа желательно юзать QVector.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
SABROG
Гость
« Ответ #5 : Июль 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.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #6 : Июль 11, 2007, 15:53 »

QList это тотже QVector только с быстрой вставкой в начало О(1).

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #7 : Июль 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
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
SABROG
Гость
« Ответ #8 : Июль 11, 2007, 16:26 »

Значит я ошибся.

У меня в программе создано около двух десяткой QVariantList (QList<QVariant>), один из них содержит около 200000 записей. Может лучше мне выбрать что-то другое, чтобы быстро заносить данные в массив ? Правда тогда мне придется переписать логику программы и отказаться от bindа в SQL.
Записан
Sergeich
Гость
« Ответ #9 : Июль 11, 2007, 16:45 »

Господа, почитывайте Qt Quarterly Подмигивающий http://doc.trolltech.com/qq/qq19-containers.html Оно сеет доброе, разумное, вечное.  Веселый
Записан
SABROG
Гость
« Ответ #10 : Июль 11, 2007, 16:49 »

Цитата: "Sergeich"
Господа, почитывайте Qt Quarterly Подмигивающий http://doc.trolltech.com/qq/qq19-containers.html Оно сеет доброе, разумное, вечное.  Веселый


Там написано, что begin и end храняться отдельно в QList'e Улыбающийся
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #11 : Июль 11, 2007, 16:53 »

Цитата: "SABROG"
Значит я ошибся.

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


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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
SABROG
Гость
« Ответ #12 : Июль 11, 2007, 16:54 »

Не, у меня просто парсится XML и данные последовательно через append кладутся в QList, после заполнения этот QList передается на Bind который собственно и заносит данные в базу данных.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #13 : Июль 11, 2007, 17:12 »

Если выполняется добавление элеменотов в конец, QVector'а тебе с головой хватит. Если извесно кол-во записей, можешь сделать вектору resize(<кол-во записей>) и обращаться к элементам последовательно по индексу. Так будет быстрее, чем делать 200000 раз append
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
SABROG
Гость
« Ответ #14 : Июль 11, 2007, 17:17 »

Количество записей не извесно, можно конечно сделать их извесным пройдясь по всему XMLю, но потом придется проходить еще раз по нему от начала. А QVector вообще как-то совместим с типом QList ? Я использу addBindValue класса QSqlQuery для передачи QVariantList (QList<QVariant>).
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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