在指定索引处移动数组元素

时间:2014-07-02 19:22:05

标签: c++ arrays sorting stdvector indices

将指定索引的数组元素左右移位一个位置的最有效算法是什么?

例如[a,b,c,d,e,f]向左移动指数[1,3,5]得到[b,a,d,c,f,e]

如果新索引超出范围,我不希望它旋转,如果这是有道理的。

我正在使用C ++ std :: vector进行数组存储。

2 个答案:

答案 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] );
}