Я столкнулся с этой проблемой, когда попытался написать новый алгоритм для изменения порядка элементов в std :: vector. Основная идея состоит в том, что у меня есть std :: список указателей, указывающих на std :: vector таким образом, что *list.begin() == vector[0]
, *(++list.begin()) == vector[1]
и так далее.
Однако любые изменения в позициях элементов списка нарушают отображение. (Включая добавленные указатели) Когда отображение нарушено, элементы списка могут быть в произвольном порядке, но они по-прежнему указывают на правильные элементы на векторе. Задача состоит в том, чтобы переупорядочить элементы в векторе, чтобы исправить отображение.
Самый простой способ сделать это (Как я это сделал сейчас):
- создайте новый пустой std :: vector и измените его размер до размера старого вектора.
- переберите список, прочитайте элементы из старого вектора и запишите их в новый вектор. Установите указатель так, чтобы он указывал на элемент нового вектора.
- поменяйте местами векторы и освободите старый вектор.
К сожалению, этот метод полезен только тогда, когда мне нужно больше возможностей для вектора. Это неэффективно, когда текущий вектор, содержащий элементы, имеет достаточную емкость для хранения всех входящих элементов. Добавленные указатели в списке будут указывать на косяк другого вектора. Простой метод работает для этого, потому что он читает только из указателей.
Так что я бы хотел переупорядочить вектор «на месте», используя постоянный объем памяти. Любой указатель, который не указывал на сторгат текущего вектора, перемещается так, чтобы указывать на сторгат текущего вектора. Элементы - это простые структуры. (стручки)
Я постараюсь опубликовать пример кода, когда у меня будет время ..
Что я должен сделать, чтобы достичь этого? У меня есть основная идея, но я не уверен, возможно ли вообще выполнить переупорядочение с постоянным объемом памяти.
PS: Извините за (возможно) плохую грамматику и опечатки в посте. Я надеюсь, что это все еще читабельно. :)