我的函数的控制结构不会阻止它无限期地继续下去。为什么?

The control structure of my function doesn't prevent it from continuing indefinitely. Why?

本文关键字:继续 为什么 无限期 控制结构 函数 我的      更新时间:2023-10-16

使用将 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);修复此问题