如何在动态分配的对象数组中对空对象进行排序,以便空对象位于数组c ++的后面

时间:2016-04-02 05:20:47

标签: c++ arrays sorting

我有一个动态分配的对象数组。一些数组由对象填充,但其他部分为空。当我使用冒泡排序对数组中的对象进行排序时,它会正确排序,但是null的数组部分位于填充的数组部分的前面。有没有办法将空对象推送到数组的后面而不是前面?

数组中发生的事情的图片:

| null | null | null | object | object |

我希望数组看起来像什么的图片:

| object| object | null | null | null |

这是我的冒泡排序代码:

::bubbleSort()
{
  bool flag = true;
  obj temp;
  int j = 0;

  while(flag)
  {
    flag = false;
    j++;

    for(int i = 0; i < (max - j); i++)
    {
      if(arr[i] > arr[i + 1])
      {
        temp = arr[i];
        arr[i]= arr[i+1];
        arr[i+1] = temp;
        flag = true;
      } 
    }
  }
}

这是我如何定义我的arr:

private:
obj *arr;

然后在我的构造函数

max = 25
arr = new obj[max];

2 个答案:

答案 0 :(得分:1)

您可以将std::sort与自定义比较器一起使用:

std::sort(std::begin(arr), std::end(arr), [](auto *p1, auto *p2) {
    if (p1 == nullptr) {
        return false;
    }

    if (p2 == nullptr) {
        return true;
    }

    return *p1 < *p2;
});

这假定您的自定义类型定义operator<。当然,您可以使用您喜欢的任何其他内容来比较它们。

如果你必须实现自己的排序算法,你仍然可以将比较器函数的主体内联到排序代码的中间。

答案 1 :(得分:1)

您正在寻找的功能可能是std::partition,如果您想要的是后面的空值。如果您还需要对其他值进行排序,std::sort是正确的选择。两者都允许您定义一个定义排序或分区顺序的比较,允许您自定义元素的排序方式。