Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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++ 循环置换_C++ - Fatal编程技术网

C++ 循环置换

C++ 循环置换,c++,C++,我正在尝试编写一个排列数组的函数 #include <iostream> #include "print.h" #include "random.h" #include <memory> int* permute_by_cycle(int A[], int size) { int dest; int* C = new int[size]; int last = size - 1; int offset = random(0, last);

我正在尝试编写一个排列数组的函数

#include <iostream>
#include "print.h"
#include "random.h"
#include <memory>
int* permute_by_cycle(int A[], int size)
{
    int dest;
    int* C = new int[size];
    int last = size - 1;
    int offset = random(0, last);
    std::cout << "offset = " << offset << std::endl;
    for(int i = 0; i < size; i++) {
        dest = i + offset;
        //std::cout << "dest = " << dest << "\tlast = " << last << std::endl;
        if(dest > last)
            dest -= last;
        C[dest] = A[i];

    }
    return C;
}
int main()
{
    int size = 18;
    int A[size];
    //int* B = new int[size];
    fill(A,size);
    print(A,size);
    int* B = permute_by_cycle(A, size);
    print(B,size);
    delete [] B;
    return 0;
}
但是,只要
偏移量
大于零,其中一个元素就不会被
A[i]
替换,只剩下默认的初始化值。我似乎不知道问题出在哪里。代码中的
fill
print
函数只是用随机元素填充数组并打印数组的函数

#include <iostream>
#include "print.h"
#include "random.h"
#include <memory>
int* permute_by_cycle(int A[], int size)
{
    int dest;
    int* C = new int[size];
    int last = size - 1;
    int offset = random(0, last);
    std::cout << "offset = " << offset << std::endl;
    for(int i = 0; i < size; i++) {
        dest = i + offset;
        //std::cout << "dest = " << dest << "\tlast = " << last << std::endl;
        if(dest > last)
            dest -= last;
        C[dest] = A[i];

    }
    return C;
}
int main()
{
    int size = 18;
    int A[size];
    //int* B = new int[size];
    fill(A,size);
    print(A,size);
    int* B = permute_by_cycle(A, size);
    print(B,size);
    delete [] B;
    return 0;
}
替换

    if(dest > last)
        dest -= last;
与:

    if(dest > last)
        dest -= size;
您应该使用
操作符来管理循环访问。我的首选版本是:

for(int i = 0; i < size; i++) {
    C[(i+offset)%size] = A[i];
}
for(int i=0;i

这样,您可以删除
dest
和所有相关的易出错行:)

您是否尝试过
std::next_permutation
?可能有用(除非你只是想实现算法)。我曾试图实现该算法,但我也会看一看。