![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
wiz29 |
![]()
Сообщение
#1
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: ![]() ![]() ![]() |
Суть задачи следующая:
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
Прикрепленные файлы
|
|
|
wiz29 |
![]()
Сообщение
#2
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Алексей1153 |
![]()
Сообщение
#3
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
зачем велосипед, когда уже есть
std::vector<int> std::vector<int>::insert хотя, я понял, что задачу не понял )) Написано непонятно парой слов: перетаскиваем отрезок вектора в другую позицию. Так ? |
|
|
Iron Bug |
![]()
Сообщение
#4
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
тут возможны разные реализации. смотря чего хотим достичь.
в общем случае, удобны двусвязные списки. перекинул два указателя - вот тебе и "перемещение". но проход по списку будет медленнее и выборка конкретного элемента - тоже. есть методы, используемые в синтаксических анализаторах: когда есть строка и есть указатели на начало и конец кусочков. выборка происходит без работы со строками, меняются только указатели в списке. есть и другие варианты. всё зависит от требований оптимизации. |
|
|
wiz29 |
![]()
Сообщение
#5
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 600 Регистрация: 7.7.2010 Из: Санкт-Петербург Пользователь №: 1866 Спасибо сказали: 94 раз(а) Репутация: ![]() ![]() ![]() |
парой слов: перетаскиваем отрезок вектора в другую позицию. Так ? нет, подмножество элементов вектора. Отрезок это непрерывный кусок. тут возможны разные реализации. смотря чего хотим достичь. в общем случае, удобны двусвязные списки. Хотелось получить на выходе некий универсальный, логически оптимальный вариант для индексируемых контейнеров. Поскольку произвольный доступ к элементам классического списка довольно дорогая штука (в моих задачах, часто важен быстрый доступ к элементу по его индексу, а задача перемещения, относительно редкая). |
|
|
Iron Bug |
![]()
Сообщение
#6
|
![]() Профессионал ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: ![]() ![]() ![]() |
тогда обычный вектор из STL вполне подойдёт. он как раз занимается индексированными списками с произвольным доступом и делает это довольно шустро.
|
|
|
![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 4.4.2025, 13:15 |