Смещение элементов массива по указанным индексам

Каков наиболее эффективный алгоритм для смещения элементов массива по указанным индексам влево и вправо на одну позицию?

Например, сдвиньте индексы [1,3,5] of [a, b, c, d, e, f] влево, чтобы получить [b, a, d, c, f, e]

Я не хочу, чтобы он вращался, если новый индекс выходит за границы, если это имеет смысл.

Я использую C ++ std :: vector для хранения массивов.

0

Решение

Я интерпретирую ваш вопрос как поменять местами две соседние записи массива на основе индекса. Если это не так, то, пожалуйста, уточните свой вопрос с примером, для которого это не правильно.

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]):
}
}
2

Другие решения

Я думаю, что самый простой способ — это использовать 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] );
}
0

По вопросам рекламы [email protected]