crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Тема закрытаНачать новую тему
> Перемещение подмножества элементов списка в заданную позицию
wiz29
  опции профиля:
сообщение 4.4.2012, 16:06
Сообщение #1


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Суть задачи следующая:

1. Имеем последовательность элементов в контейнере (контейнер с индексируемыми элементами). Для наглядности приведу примеры для QList<int>
2. Задано подмножество индексов в данной последовательности, которое надо перенести на требуемую позицию ("до" или "после")

Схематично можно представить как
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14) - исходная последовательность
----*-----*----*--^----*-------------------------- - * обозначены выбранные элементы ^ позиция, в которую нужно переместить выбранное подмножество
(0, 2, 4, 6, 1, 3, 5, 8, 7, 9, 10, 11, 12, 13, 14) - результат вставки "после" выбранной позиции
(0, 2, 4, 1, 3, 5, 8, 6, 7, 9, 10, 11, 12, 13, 14) - результат вставки "до" выбранной позиции

Подобная задача актуальна для drag and drop подмножества строк в одном и том же представлении.

Предлагайте варианты решения. У меня есть вариант решения, но боюсь что он не оптимальный.

Сообщение отредактировал wiz29 - 4.4.2012, 16:11
Прикрепленные файлы
Прикрепленный файл  main.txt ( 2,31 килобайт ) Кол-во скачиваний: 7
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 4.4.2012, 17:04
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


модифицированный вариант
Прикрепленные файлы
Прикрепленный файл  modify.txt ( 3,23 килобайт ) Кол-во скачиваний: 4
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 4.4.2012, 19:04
Сообщение #3


фрилансер
******

Группа: Участник
Сообщений: 2941
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


зачем велосипед, когда уже есть

std::vector<int>

std::vector<int>::insert

хотя, я понял, что задачу не понял )) Написано непонятно

парой слов: перетаскиваем отрезок вектора в другую позицию. Так ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 4.4.2012, 21:06
Сообщение #4


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


тут возможны разные реализации. смотря чего хотим достичь.
в общем случае, удобны двусвязные списки. перекинул два указателя - вот тебе и "перемещение". но проход по списку будет медленнее и выборка конкретного элемента - тоже. есть методы, используемые в синтаксических анализаторах: когда есть строка и есть указатели на начало и конец кусочков. выборка происходит без работы со строками, меняются только указатели в списке. есть и другие варианты. всё зависит от требований оптимизации.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 5.4.2012, 9:13
Сообщение #5


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


Цитата(Алексей1153 @ 4.4.2012, 20:04) *
парой слов: перетаскиваем отрезок вектора в другую позицию. Так ?

нет, подмножество элементов вектора. Отрезок это непрерывный кусок.

Цитата(Iron Bug @ 4.4.2012, 22:06) *
тут возможны разные реализации. смотря чего хотим достичь.
в общем случае, удобны двусвязные списки.


Хотелось получить на выходе некий универсальный, логически оптимальный вариант для индексируемых контейнеров. Поскольку произвольный доступ к элементам классического списка довольно дорогая штука (в моих задачах, часто важен быстрый доступ к элементу по его индексу, а задача перемещения, относительно редкая).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 5.4.2012, 17:07
Сообщение #6


Профессионал
*****

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


тогда обычный вектор из STL вполне подойдёт. он как раз занимается индексированными списками с произвольным доступом и делает это довольно шустро.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Тема закрытаНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.11.2024, 10:56