Каков наиболее эффективный алгоритм для смещения элементов массива по указанным индексам влево и вправо на одну позицию?
Например, сдвиньте индексы [1,3,5] of [a, b, c, d, e, f] влево, чтобы получить [b, a, d, c, f, e]
Я не хочу, чтобы он вращался, если новый индекс выходит за границы, если это имеет смысл.
Я использую C ++ std :: vector для хранения массивов.
Я интерпретирую ваш вопрос как поменять местами две соседние записи массива на основе индекса. Если это не так, то, пожалуйста, уточните свой вопрос с примером, для которого это не правильно.
void swapElements(const std::vector<int>& indexes, std::vector<int>& array){
for(auto i : indexes){
if (i < 1 || i >= array.size()){
continue;
}
std::swap(array[i-1], array[i]):
}
}
Я думаю, что самый простой способ — это использовать std::swap
с элементом с данным индексом и элементом, который предшествует ему.
Для первого элемента вы можете использовать
std::swap( v.front(), v.back() );
Вот пример
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<char> v = { 'a', 'b', 'c', 'd', 'e', 'f' };
for ( char c : v ) std::cout << c << ' ';
std::cout << std::endl;
for ( size_t i : { 1, 3, 5 } )
{
if ( i == 0 ) std::swap( v.front(), v.back() );
else if ( i < v.size() ) std::swap( v[i], v[i-1] );
}
for ( char c : v ) std::cout << c << ' ';
std::cout << std::endl;
return 0;
}
Выход
a b c d e f
b a d c f e
Если вы не хотите вращать вектор, вы можете использовать оператор if для следующего
for ( size_t i : { 1, 3, 5 } )
{
if ( 0 < i && i < v.size() ) std::swap( v[i], v[i-1] );
}