在c++中,如何仅使用指针将每个元素向右移动1
In C++, how can one move each element one to the right using only pointers?
例如,这个数组例如,[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
操作的是迭代器,指针是迭代器:
#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
。
在*ptr2 = *ptr;
处,您已经丢失了关于第二个元素初始值的信息。
我希望这能让你明白为什么你目前的方法行不通。
我假设n
是数组的大小。如果是,可以使用以下代码:
int tmp = arr[n - 1]; /* Store the last element in `tmp` */
for(int i = n - 1; i > 0; i--) /* Loop backwards */
arr[i] = arr[i - 1]; /* Move all elements up */
arr[0] = tmp; /* Insert the last element at the first location */
相关文章:
- 右移布尔值在C++
- 何时右移操作>>移位符号位,何时不?
- 这个右移是如何工作的:字符串流>>无符号的int>>无符号的int?
- C++中的负数右移运算符
- C++ 尝试将数字右移 32 会得到两种不同的结果
- 对已签名数据进行逻辑右移
- 右移速度与左移相同的速度测试位
- 右移无法正常工作
- 为什么将 int a=1 移到左 31 位然后向右移 31 位,它变成 -1
- 当 b 大于 a 中的位数时右移(a >> b)的未定义行为?
- 为什么无符号的 int 右移总是用"1"填充
- 重载左移和右移运算符(cin和cout)
- 在c++中,取一个整数数组(arr[])、其长度(N)和元素数右移(M):
- 右移g++时出现意外结果
- 如果计数大于类型的宽度,则为右移未定义的行为
- 使用左移或右移计算对数基数 n
- 如何将数组(或c字符串)中的元素左移给定数量的索引
- static_assert签名的右移具有两个补码行为是否合法?
- 在C/C++中,左移或右移零点实际上会生成一条指令
- C++中的右移产生异常结果(无符号64位)