LINUX.ORG.RU

Переставить элементы контейнера в фиксированной последовательности

 ,


0

1

Вопрос знатокам стандартной библиотеки для C++ до 20. Есть ли такая стандартная машинерия, которая переставляет элементы контейнера в порядке указанных индексов?

Что-то типа:

std::list<int> xs{1, 2, 3, 4, 5};
std::vector<int> xsIndices{2, 0, 3, 1, 4};
std::reorder(xs.begin(), xs.end(), xsIndices.begin());

и в результате в xs будет 3 -> 1 -> 4 -> 2 -> 5.

★★★★★

std::sort с кастомным компаратором

или std::shuffle с URBG, выдающим индексы в нужной последовательности - но это уже совсем черная магия, и только для контейнеров со случайным доступом

Lrrr ★★★★★
()
Последнее исправление: Lrrr (всего исправлений: 1)

auto temp_list = xs;

auto temp_list_iter = std::list::iterator(temp_list.begin());

std::transform(xsIndices.begin(), xsIndices.end(), xs.begin(), [&temp_list_iter](int i){ return *std::next(temp_list_iter, i); });

cyberhoffman
()
Ответ на: комментарий от cyberhoffman

кратко но медленно) 100k элементов за 8.5сек core5, когда просто сортировка списка 3сек, те лучше сортировку переделать

anonymous2 ★★★★★
()
Последнее исправление: anonymous2 (всего исправлений: 2)
Ответ на: комментарий от anonymous2

Да мне кажется, что быстрого решения для списка с индексами не будет. Т.е. список и индекс - вещи не то, что бы несовместимые, но неоптимальные.

hatred ★★★
()

Может проще новый вектор создать и кастомным итератором сделать туда std::copy?

WatchCat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.