Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 交换N个变量_C++_Algorithm - Fatal编程技术网

C++ 交换N个变量

C++ 交换N个变量,c++,algorithm,C++,Algorithm,C++中有一个函数允许以循环方式更改N个变量的值 例如,我有三个变量: int i = 5; int j = 7; int h = 3; swap(i,j,h); // i value is 7 // j value is 3 // h value is 5 我可以使用N-1调用来实现swap函数。但是,它可以以更好的方式实施,执行更少的操作: int aux = i; i = j; j = h; h = aux; 我对N个变量3,4,5,6感兴趣 编辑: 实际上,我有一个int[],我需要

C++中有一个函数允许以循环方式更改N个变量的值

例如,我有三个变量:

int i = 5;
int j = 7;
int h = 3;
swap(i,j,h);
// i value is 7
// j value is 3
// h value is 5
我可以使用N-1调用来实现swap函数。但是,它可以以更好的方式实施,执行更少的操作:

int aux = i;
i = j;
j = h;
h = aux;
我对N个变量3,4,5,6感兴趣

编辑: 实际上,我有一个int[],我需要旋转一些元素

int a[10] = {1,4,5,3,2,7,8,9,6,0};
首先,我计算要旋转的索引集,例如2,7,5和3,然后我需要旋转索引2,7,5和3值5,9,7,3处的元素,并产生以下更改:

 0 1 2 3 4 5 6 7 8 9   // indexes
{1,4,5,3,2,7,8,9,6,0}; // values

 0 1 7 2 4 3 6 5 8 9   // moved from index
{1,4,9,5,2,3,8,7,6,0}; // new value
您可以按照注释中的建议使用std::rotate

#include <vector>
#include <array>
#include <algorithm>

template <typename Container>
void rotate_left(Container& c)
{
    std::rotate(c.begin(), c.begin() + 1, c.end());
}

int main()
{
    int i = 5, j = 7, h = 3;
    std::array<int,3> a {i, j, h};
    std::vector<int> v {i, j, h};
    rotate_left(a);
    rotate_left(v);

    return 0;
}
是您可以使用的基准。

您可以按照注释中的建议使用std::rotate

#include <vector>
#include <array>
#include <algorithm>

template <typename Container>
void rotate_left(Container& c)
{
    std::rotate(c.begin(), c.begin() + 1, c.end());
}

int main()
{
    int i = 5, j = 7, h = 3;
    std::array<int,3> a {i, j, h};
    std::vector<int> v {i, j, h};
    rotate_left(a);
    rotate_left(v);

    return 0;
}


是一个你可以使用的基准。

可能是你想要的。这是一个旋转一个位置的想法,但适用于变量而不是迭代器。@JoseMaria可能会将变量放入数组中?然后使用std::rotate.@JoseMaria-如果变量是这样耦合的,为什么它们不在一个数组中?这不是一个循环旋转,这是一个一般的排列。非常不同的问题。可能就是你想要的。这是一个旋转一个位置的想法,但应用于变量而不是迭代器。@JoseMaria可能会将变量放入数组中?然后使用std::rotate.@JoseMaria-如果变量是这样耦合的,为什么它们不在一个数组中?这不是一个循环旋转,这是一个一般的排列。非常不同的问题。但是旋转函数旋转所有元素,我只需要旋转任意有序的元素集。@JoseMaria什么是任意有序集?rotate不会旋转所有元素,只旋转您要求的范围内的元素。例如,我需要旋转索引4、10、5、6和0处的元素。这是一个任意顺序的集合,不同于旋转10,6,5,0,4。我编辑了答案。现在它正确地再现了您的示例,@JoseMaria我很好奇,添加了一个只有1个临时变量的示例。gcc9.1几乎没有性能差异。与clang 8.0相比,差异更大。但是旋转功能旋转所有元素,我只需要旋转任意有序的元素集。@JoseMaria什么是任意有序集?rotate不会旋转所有元素,只旋转您要求的范围内的元素。例如,我需要旋转索引4、10、5、6和0处的元素。这是一个任意顺序的集合,不同于旋转10,6,5,0,4。我编辑了答案。现在它正确地再现了您的示例,@JoseMaria我很好奇,添加了一个只有1个临时变量的示例。gcc9.1几乎没有性能差异。使用Clang8.0时,差异更为显著。
#include <vector>

int main()
{
    // input taken from your example
    std::vector<int> v {1, 4, 5, 3, 2, 7, 8, 9, 6, 0};
    std::vector<size_t> indexes {2, 7, 5, 3};

    // rotate the values by index (7->2, 5->7, 3->5, 2->3)
    int tmp = v[indexes[0]];
    for (size_t ind = 0; ind<indexes.size()-1; ++ind)
        v[indexes[ind]] = v[indexes[ind+1]];
    v[indexes.back()] = tmp;        

    return 0;
}
// output: 1, 4, 9, 5, 2, 3, 8, 7, 6, 0