Название: circular buffer для qt Отправлено: deMax от Декабрь 03, 2015, 15:20 Есть массив данных QList<Data> и в этом массиве всегда size элементов. Каждую секунду данные обновляются, в конец дописывают новые данные вначале стирают, длинна не изменяется. Как это реализовать правильнее?
1. Использовать QList push+pop (будет туда сюда память гонять) 2. Создать вектор/массив и хранить смещение на начало? Название: Re: Контейнер для хранения циклограммы Отправлено: PimenS от Декабрь 03, 2015, 15:33 А QQueue<T> не подходит?
Название: Re: Контейнер для хранения циклограммы Отправлено: ibnz от Декабрь 03, 2015, 15:34 http://www.boost.org/doc/libs/1_39_0/libs/circular_buffer/doc/circular_buffer.html
Название: Re: Контейнер для хранения циклограммы Отправлено: deMax от Декабрь 03, 2015, 15:41 ibnz, circular_buffer оно. Есть решение на qt без буста(конечно легко и самому реализовать, но готовые решения как правило читабельнее - меньше кода)
Название: Re: circular buffer для qt Отправлено: deMax от Декабрь 03, 2015, 15:50 Спасибо за подсказку.
нашел класс QCircularBuffer, а зачем ему? Код: #include <Qt3D> Название: Re: circular buffer для qt Отправлено: Vamireh от Декабрь 04, 2015, 06:56 Например, QCustomPlot писали не дураки, надо полагать. Там тупо сделано:
Код: while (queue.size() > needSize) queue.dequeue(); Название: Re: circular buffer для qt Отправлено: lit-uriy от Декабрь 04, 2015, 07:55 1. Использовать QList push+pop (будет туда сюда память гонять) Используй QList::reserve(int)Название: Re: circular buffer для qt Отправлено: deMax от Декабрь 04, 2015, 08:45 Используй QList::reserve(int) Т.е. в принципе если сделать reserve(size), потом удалить в начале, вставить в конец то с памятью оно играться не буде и операция быстрая будет?Рисую линию из этого массива через QPainterPath, можно ли у PainterPath удалять начальные элементы или каждый раз его заново создавать? иногда прежде чем загнать в QPainterPath линию сглаживаю сплайнами(т.е. кол-во точек умножается на splineCount). p.s. Можно ли рисовать линии с координатами int/double? (У float 25бит на значение иногда не хватает и страдает точность). Название: Re: circular buffer для qt Отправлено: Igors от Декабрь 04, 2015, 10:20 1. Использовать QList push+pop (будет туда сюда память гонять) Зачем push/pop если QList заточен и на добавление в голову? (см QList::prepend()) как и на удаление с головы. Странно что фаны не обвинили Вас в "незнании документации" :) Формально самопальный контейнер может быть быстрее, но выигрыш здесь крохи, связываться не стоитРисую линию из этого массива через QPainterPath, можно ли у PainterPath удалять начальные элементы или каждый раз его заново создавать? Вам же прекрасно известно - сначала надо в букварь заглянуть, а потом вопросы задавать. Где Вы видите методы удаления из QPainterPath? Зато полно методов принимающих QRectF и QPointF иногда прежде чем загнать в QPainterPath линию сглаживаю сплайнами(т.е. кол-во точек умножается на splineCount). p.s. Можно ли рисовать линии с координатами int/double? (У float 25бит на значение иногда не хватает и страдает точность). Название: Re: circular buffer для qt Отправлено: Old от Декабрь 04, 2015, 10:45 2. Создать вектор/массив и хранить смещение на начало? Хранить смещения на элементы для чтения и записи.Достоинства кольцевого буфера в том, что он не требует переаллокации совсем. Использование других контейнеров скорее всего потащат за собой переаллокации. Реализовать колцевой буфер дело нескольких минут. Название: Re: circular buffer для qt Отправлено: Авварон от Декабрь 04, 2015, 12:40 В коре кутей где-то есть приватный циркулярный буффер нормальный (с фиксированным размером).
Название: Re: circular buffer для qt Отправлено: deMax от Декабрь 04, 2015, 23:43 В коре кутей где-то есть приватный циркулярный буффер нормальный (с фиксированным размером). это? http://www.prog.org.ru/index.php?topic=29591.msg217470#msg217470 |