Связанный список будет хорошим подходом, поскольку вам не нужно перемещать все промежуточные элементы. std::list
работает просто отлично, в сочетании с splice()
. Вам понадобится итератор для элемента, который вы хотите переместить на передний план:
#include <list>
#include <iostream>
#include "prettyprint.hpp"
int main()
{
std::list<int> x { 1, 4, 6, 7, 2 };
auto i = x.begin(); std::advance(i, 2); // i points to 6
std::cout << x << std::endl; // [1, 4, 6, 7, 2]
x.splice(x.begin(), x, i);
std::cout << x << std::endl; // [6, 1, 4, 7, 2]
}
(Использование быстрого принтера для быстрой демонстрации.)
Как уже говорили другие, будет ли эффективнее, если контейнер произвольного доступа зависит от того, как вы отслеживаете элемент, который хотите переместить.
Обновление: В свете замечаний Стива я также хотел бы предложить решение с необработанным C-массивом. Преимущество состоит в том, что вы можете получить к нему доступ по положению за время O (1) и что ему требуется минимальное пространство:
char y[] = { 'a', 'c', 'Q', '%', '5' };
std::cout << pretty_print_array(y) << std::endl; // [a, c, Q, %, 5]
std::rotate(y, y + 2, y + sizeof(y));
std::cout << pretty_print_array(y) << std::endl; // [Q, %, 5, a, c]
Вызов rotate
может быть заключен в функцию:
template <typename T, size_t N>
void bring_forward(T (& a)[N], size_t p) { std::rotate(a, a + p, a + N); }