C++ 移动圆形阵列

C++ 移动圆形阵列,c++,C++,我有一个家庭作业,需要移动一个圆形数组-内存中的n个位置 我用下面的C++语法完成任务: while ( r < 0 ) // rotate negatively. { if ( i == top+1 ) { current->n = items[top+1].n; items[top+1].n = items[back-1].n; } midPtr->n = items[++i].n; items

我有一个家庭作业,需要移动一个圆形数组-内存中的n个位置

我用下面的C++语法完成任务:

while ( r < 0 )  // rotate negatively.
{
    if ( i == top+1 )
    {
        current->n = items[top+1].n;  
        items[top+1].n = items[back-1].n;
    }
    midPtr->n  = items[++i].n;
    items[i].n = current->n;

    if ( i == back-1 )
    {
            items[back-1].n = current->n;
            i = 0;
            r++; continue;
    }
    else
    {
            current->n = items[++i].n;
            items[i].n = midPtr->n;
            if ( i == back-1 )
            {
                    i = 0;
                    r++; continue;
            }
    }
}
while(r<0)//反向旋转。
{
如果(i==顶部+1)
{
当前->n=项目[top+1].n;
项目[top+1].n=项目[back-1].n;
}
midPtr->n=项目[++i].n;
物料[i].n=当前->n;
如果(i==back-1)
{
项目[back-1].n=当前->n;
i=0;
r++;继续;
}
其他的
{
当前->n=项目[++i].n;
项目[i].n=midPtr->n;
如果(i==back-1)
{
i=0;
r++;继续;
}
}
}
我想知道是否有人有更好、更高效的 将圆形阵列移动-n个单位的方法

因为我似乎在进行不必要的转移 在PTR变量之间,

不给你代码(这毕竟是一个家庭作业)考虑这个… 循环数组只是内存中n个单元的分配和指向数组“开始”的指针。数组中的第一项不一定是分配内存中的最低地址,而只是指向数组中表示逻辑第一个元素的项的指针/索引。移动数组只是移动第一个元素的索引。它可以不带循环,简单地计算索引需要移动到什么程度-考虑到数据结构的循环性质。

< P>不给你代码(这毕竟是一个家庭作业)考虑这个…
循环数组只是内存中n个单元的分配和指向数组“开始”的指针。数组中的第一项不一定是分配内存中的最低地址,而只是指向数组中表示逻辑第一个元素的项的指针/索引。移动数组只是移动第一个元素的索引。考虑到数据结构的循环性质,它可以不使用循环,只需计算索引需要移动的距离。

Finnicky,但是,我想,好吧(有太多的地方可能会有off-by-1错误,以确保它们都正确——只要确保有大量的单元测试;-)。就个人而言,每当面临这样的问题时(在真实的工作环境中——唉,家庭作业的时间对我来说已经远远过去了;-),我倾向于专注于很久以前从Gries那里学到的东西……:数组中的任何“交换两个块”任务都可以非常有效地执行(线性时间,0额外内存),只需一个原语——“反转一个块”. 将数组视为普通的紧凑内存,假设您有…:

start
  .
  .
beg1
  .
  .
end1
  .
  .
beg2
  .
  .
end2
  .
  .
finis
您的任务是将块(beg1..end1)与块(beg2..end2)交换。Gries解决方案是(在每种情况下,给定一个块(开始..结束),包括极端值):

…仅此而已!-)由于反转(X..Y)采取(Y-X+1)基本移动,格里斯解采取2*(end2-beg1+1)这样的移动——在某些特殊情况下(例如,beg2比end1大得多,两个块的长度完全相同),与“最小可能基本移动”解相比,相对开销可能很高,但这种普遍性和芬尼基对“一个接一个”问题的担忧的缺乏,让我觉得它更有价值

当然,“旋转”是“交换两个块”的特例。所以我的直觉是确保我有“反转”原语(无论如何编程要容易得多;-),然后使用它


但是,我只需要担心我的代码是否清晰、正确和快速,而不必担心助教将如何对其进行评估

Finnicky,但是,我想,好吧(有太多的地方可能会有1个错误,以确保它们都是正确的——只要确保有大量的单元测试;-)。就个人而言,每当面临这样的问题时(在真实的工作环境中——唉,家庭作业的时间对我来说已经远远过去了;-),我倾向于专注于很久以前从Gries那里学到的东西……:数组中的任何“交换两个块”任务都可以非常有效地执行(线性时间,0额外内存),只需一个原语——“反转一个块”. 将数组视为普通的紧凑内存,假设您有…:

start
  .
  .
beg1
  .
  .
end1
  .
  .
beg2
  .
  .
end2
  .
  .
finis
您的任务是将块(beg1..end1)与块(beg2..end2)交换。Gries解决方案是(在每种情况下,给定一个块(开始..结束),包括极端值):

…仅此而已!-)由于反转(X..Y)采取(Y-X+1)基本移动,格里斯解采取2*(end2-beg1+1)这样的移动——在某些特殊情况下(例如,beg2比end1大得多,两个块的长度完全相同),与“最小可能基本移动”解相比,相对开销可能很高,但这种普遍性和芬尼基对“一个接一个”问题的担忧的缺乏,让我觉得它更有价值

当然,“旋转”是“交换两个块”的特例。所以我的直觉是确保我有“反转”原语(无论如何编程要容易得多;-),然后使用它


但是,我只需要担心我的代码是否清晰、正确和快速,而不必担心助教将如何对其进行评估

请在编辑器中用4个空格缩进您的代码,然后它将正确呈现。为什么必须移动圆形数组?因为它是圆形的,所以项目所在的位置无关紧要!是的,这可能是一个技巧性的问题,你的教授只是想确保你理解什么是循环缓冲区以及它是如何使用的。也许不是,但都是“继续”语句是多余的。假设
items
是数组,我不知道
midPtr
current
是关于什么的-如果您包括所有相关的变量声明,可能会更清楚。还不清楚为什么要使用
r
来表示问题描述中引用的
n