Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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++,我有一个自定义数组对象。它有两个主要变量: m_array=指向动态数组的指针 m_size—数组的大小。此数组的大小为10 当我向左旋转时,这可以正常工作: std::rotate(m_array + 0, m_array + 1, m_array + m_size); 这相当于: // simple rotation to the left std::rotate(v.begin(), v.begin() + 1, v.end()); 当我尝试向右旋转时,我得到一个运行时错误 我需要这

我有一个自定义数组对象。它有两个主要变量:

m_array=指向动态数组的指针

m_size—数组的大小。此数组的大小为10

当我向左旋转时,这可以正常工作:

 std::rotate(m_array + 0, m_array + 1, m_array + m_size);
这相当于:

// simple rotation to the left
std::rotate(v.begin(), v.begin() + 1, v.end());
当我尝试向右旋转时,我得到一个运行时错误

我需要这个的等价物:

// simple rotation to the right
std::rotate(v.rbegin(), v.rbegin() + 1, v.rend());
我试过这个:

std::rotate(m_array + m_size, m_array + m_size + 1, m_array + 0);
std::rotate(m_array + m_size - 1, m_array + (m_size - 1) + 1, m_array + 0);
我得到错误:迭代器范围无效

所以,我觉得这是m_尺寸,所以我尝试了这个:

std::rotate(m_array + m_size, m_array + m_size + 1, m_array + 0);
std::rotate(m_array + m_size - 1, m_array + (m_size - 1) + 1, m_array + 0);
我得到了同样的错误

思想是受欢迎的

我试图追踪的消息来源:

要进行右旋转(借用您的短语),您希望范围是数组中除最后一个元素之外的所有元素。我将让您调整此代码以处理可变大小的数组

#include <algorithm>
#include <iostream>

int main() {
    int data[10] = { 0, 1, 2, 3, 4,
                     5, 6, 7, 8, 9 };
    auto print_all = [&data]() {
        for(auto v: data) {
            std::cout << v << ' ';
        }
        std::cout << '\n';
    };
    print_all();

    // rotate elements to the left
    std::rotate(data, data + 1, data + 10);
    print_all();

    // rotate element to the right, back to the original position
    std::rotate(data, data + 9, data + 10);
    print_all();
    return 0;
}
要进行右旋转(借用您的短语),您希望范围是数组中除最后一个元素之外的所有元素。我将让您调整此代码以处理可变大小的数组

#include <algorithm>
#include <iostream>

int main() {
    int data[10] = { 0, 1, 2, 3, 4,
                     5, 6, 7, 8, 9 };
    auto print_all = [&data]() {
        for(auto v: data) {
            std::cout << v << ' ';
        }
        std::cout << '\n';
    };
    print_all();

    // rotate elements to the left
    std::rotate(data, data + 1, data + 10);
    print_all();

    // rotate element to the right, back to the original position
    std::rotate(data, data + 9, data + 10);
    print_all();
    return 0;
}

std::rotate(v.rbegin(),v.rbegin()+1,v.rend())
工作的原因是它使用反向迭代器。这意味着
v.rbegin()+1
实际上减少了数组中的位置,等于
v.begin()+v.size()-1

使用原始指针算法时,无法获得相同的反向迭代行为。您必须手动将左旋转转换为右旋转。这可以通过围绕阵列中心翻转旋转位置并执行左旋转来轻松完成

向左或向右旋转可以归结为将一个数组分成两个部分,然后交换它们。无论是左旋转还是右旋转,都只是决定了划分的位置。对于向左旋转
k
,旋转点位于
k mod N
。对于右旋转,旋转点位于
-k mod N
处,其中
N
是阵列的总长度。这将选择您希望位于新旋转数组的索引
0
处的原始数组中的索引

所以下面的右旋转1

std::rotate(v.rbegin(), v.rbegin() + 1, v.rend())
相当于以以下方式使用原始指针:

int* p = &v[0];
int n = v.size();
int k = -1;
std::rotate(p, p + mod(k, n), p + n);
其中,
mod()
是模运算(基本上是始终换行为正数的
%
运算符):


std::rotate(v.rbegin(),v.rbegin()+1,v.rend())
工作的原因是它使用反向迭代器。这意味着
v.rbegin()+1
实际上减少了数组中的位置,等于
v.begin()+v.size()-1

使用原始指针算法时,无法获得相同的反向迭代行为。您必须手动将左旋转转换为右旋转。这可以通过围绕阵列中心翻转旋转位置并执行左旋转来轻松完成

向左或向右旋转可以归结为将一个数组分成两个部分,然后交换它们。无论是左旋转还是右旋转,都只是决定了划分的位置。对于向左旋转
k
,旋转点位于
k mod N
。对于右旋转,旋转点位于
-k mod N
处,其中
N
是阵列的总长度。这将选择您希望位于新旋转数组的索引
0
处的原始数组中的索引

所以下面的右旋转1

std::rotate(v.rbegin(), v.rbegin() + 1, v.rend())
相当于以以下方式使用原始指针:

int* p = &v[0];
int n = v.size();
int k = -1;
std::rotate(p, p + mod(k, n), p + n);
其中,
mod()
是模运算(基本上是始终换行为正数的
%
运算符):


如果有帮助的话,就把右旋转看作是数组大部分的左旋转(这是我的想法)。如果有帮助的话,就把右旋转看作是数组大部分的左旋转(这是我的想法)。