将指定索引的数组元素左右移位一个位置的最有效算法是什么?
例如[a,b,c,d,e,f]向左移动指数[1,3,5]得到[b,a,d,c,f,e]
如果新索引超出范围,我不希望它旋转,如果这是有道理的。
我正在使用C ++ std :: vector进行数组存储。
答案 0 :(得分:2)
我解释你的问题是根据索引交换数组的两个相邻条目。如果这是错误的,那么请用一个不正确的例子澄清你的问题。
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]):
}
}
答案 1 :(得分:0)
我认为最简单的方法是将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] );
}