我的函数的控制结构不会阻止它无限期地继续下去。为什么?
The control structure of my function doesn't prevent it from continuing indefinitely. Why?
使用将 2 个指针相互"行走"的算法的一个问题是,您可能会遇到它们相互错过的情况,因为您将第一个向前移动,第二个向后移动而没有检查这些操作之间的相等性。我以为我创建的以下函数
void zeros_to_back(int * arr, int n)
{
/*
arr: Array of integers
n: Length of arr
Moves all the zeros of arr to its back.
Meant to replicate std::partition.
*/
int * pa (arr);
int * pb (arr + n);
while (pa != pb)
{
if (*pb != 0)
{
if (*pa == 0)
{
std::swap(pa, pb);
--pb;
}
else
{
++pa;
}
}
else
{
--pb;
}
}
}
足够坚固,没有这个问题,但显然不是,因为我的程序超时了。
这里有一个链接,你可以在其中进行测试:http://codepad.org/24DE1GIY
有人愿意指出我做错了什么吗?我看不出来。
int * pb (arr + n);
您正在使用一个超过数组末尾的元素初始化 PB。只要你在递减后使用它,这不是问题。
但
std::swap(pa, pb);
这将尝试将第一个元素与一个过去的结束元素交换,这是一个问题。
此外,您正在尝试交换指针而不是它们指向的值......
std::swap(*pa, *pb);
您使用std::swap
来交换指针,而不是它们指向的值。通过使用std::swap(*pa, *pb);
修复此问题
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 循环不继续无法弄清楚为什么
- 为什么我的Qt程序在断言失败后继续运行?
- 为什么我不能继续使用 std::cin 向同一变量输入其他值?
- 为什么GDB会自动继续在断点上继续
- 为什么我的代码在运行时继续崩溃
- 我的函数的控制结构不会阻止它无限期地继续下去。为什么?
- 为什么程序在 while 循环中继续输入任何字符
- 为什么达到峰值后内存泄漏不会继续
- 为什么悬空指针可以继续访问对象
- 为什么我的同时循环不会继续循环?
- 有人可以告诉我为什么我在进入'y'继续后被困在验证循环中吗?
- 为什么继续使用const对象呢?
- 为什么这个递归函数在基本情况似乎得到满足后继续被调用
- 为什么此中断不终止程序,而是继续执行下一个操作?
- 为什么要继续对不可变对象使用getter呢?
- 为什么getch()需要按下一个键才能继续执行其余的代码?