在 C++ 中,如何仅使用指针将每个元素向右移动一位? [关闭]

2024-03-19

例如,这个数组 [1,2,3,4,5] 将变成这个数组 [5,1,2,3,4]

这是我想出的,但它不起作用:

 int  *ptr = arr; //initialize to first element
    int  *ptr2 = arr+1; //initialize it to second element

   while (n >0) // keep doing it until size is done with
   {
       *ptr2 = *ptr; 
       ++ptr2;
       ptr ++;
       n--;//
   }

“仅使用指针”是一个相当模糊的要求。下面的现代解决方案在某种程度上也使用“仅指针”,因为std::rotate对迭代器和指针进行操作are迭代器:

#include <algorithm>
#include <iostream>

int main()
{
    int arr[] = { 1, 2, 3, 4, 5 };

    using std::begin;
    using std::end;
    std::rotate(begin(arr), end(arr) - 1, end(arr));

    for (auto&& element : arr)
    {
        std::cout << element << "\n";
    }
}

但我觉得给你这个作业的老师出于某种原因不会对此感到满意。至于你的解决方案:

 int  *ptr = arr; //initialize to first element
    int  *ptr2 = arr+1; //initialize it to second element

   while (n >0) // keep doing it until size is done with
   {
       *ptr2 = *ptr; 
       ++ptr2;
       ptr ++;
       n--;//
   }

(我假设你的n在循环开始之前为 4,否则您将进行超过 4 次迭代,并在最后一次中遇到未定义的行为。)

在循环的第一次迭代中:

  • arr[1]变成arr[0].
  • ptr2被指向arr[2].
  • ptr被指向arr[1].

第一次迭代后的数组:[1, 1, 3, 4, 5]

正如您所看到的,此时包含值 2 的元素已经丢失。

在循环的第二次迭代中:

  • arr[2]变成arr[1].
  • ptr2被指向arr[3].
  • ptr被指向arr[2].

第二次迭代后的数组:[1, 1, 1, 4, 5]

现在包含值 3 的元素也丢失了。现在模式已经很清晰了;你正在“丢失”所有元素,并且只是用 1 覆盖所有内容。

您必须找到一种方法来保存您要覆盖的元素。或者最好只使用std::rotate.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C++ 中,如何仅使用指针将每个元素向右移动一位? [关闭] 的相关文章

随机推荐