17

C++ 排序数组类

我有一个记录以下内容的数组对象..

这是在classone.h

ClassOne
{
string name;
int data;
float valueData;
}

并且构造函数是在classone.cpp创建的

在 main.cpp 我创建了大小为 10 的 ClassOne 数组

#include "classone.h"

ClassOne cone[10];

接下来是我为对象记录了几个值

现在 ClassOne 有 3 个对象

cone[0]
name = "hello"
data = 1
valueData = 20

cone[1]
name = "panda"
data = 2
valueData = 15

cone[2]
name = "joe"
data = 3
valueData = 25

我想要实现的是做一个排序,可以通过valueData最高升序形式重新排列这个数组,所以..它将是

cone[2]然后.. cone[0]_cone[1]

但是如果我使用冒泡排序的问题,我尝试了谷歌并找到了一些,它们是按例如排序的 int a[]={9,6,5,23,2,6,2,7,1,8};

但我想按类数组对象排序。并将值重新排列在一起,我该如何实现。

所以当我cout时

-- Highest to lowest --
1) Name: Joe , Data = 3, Value =25
2) Name: Hello , Data =1 , Value = 20
3) Name: Panda, Data = 2, Value = 15

感谢大家的帮助和指导!!

4

6 回答 6

26

最简单的方法是使用标准库:

#include <algorithm>

std::sort(cone, cone + 10,
          [](ClassOne const & a, ClassOne const & b) -> bool
          { return a.value < b.value; } );

如果您愿意在全局范围内定义比较运算符,您甚至不需要 lambda:

bool operator<(ClassOne const & a, ClassOne const & b)
{
    return a.value < b.value;
}

std::sort(cone, cone + 10);

或者您可以使比较器成为成员函数。或者,您可以为比较器函数指定一个自定义名称,并将其作为sort. 在比较特定于您的情况而不是“自然”的情况下,这可能是一个好主意:

bool ValueCmp(ClassOne const & a, ClassOne const & b)
{
    return a.value < b.value;
}

std::sort(cone, cone + 10, ValueCmp);

如果您没有 C++11 支持(对于 lambda,如第一种情况),或者如果您想在多种不同情况下重用比较器,则最后一个版本很有用。

于 2012-10-10T16:00:23.123 回答
11

使用std::sort和合适的排序函数/函子:

bool comp(const ClassOne& lhs, const ClassOne& rhs)
{
  return lhs.valueData < rhs.valueData;
}

std::sort(cone, cone+10, comp);

或者,在 C++11 中,

std::sort(std::begin(cone), std::end(cone), comp);
于 2012-10-10T16:00:31.363 回答
8

您可以创建一个结构来实现标头中用于对迭代项进行排序的operator <方法。std::sort<algorithm>

struct One {
string name;
int data;
float valueData;

bool operator < (const one &a) const{
return valueData <a.valueData;
}

};

那么你所要做的就是制作一个这个结构的数组并使用 sort 函数对其进行排序

于 2015-06-05T18:22:10.633 回答
3

查看您的冒泡排序源。在某些时候,它将相互比较int,可能使用小于运算符 (<) 或大于运算符 (>)。这就是 sort 函数确定这两项的相对顺序的地方。通过多次重复该比较,排序函数能够确定集合的总顺序。

您需要用您自己的比较函数替换该操作。一个函数,它接受你的类的两个对象,如果第一个应该被认为小于第二个,则返回 true,如果第二个应该被认为小于第一个,则返回 false,如果它们应该被认为相等则返回 false。

于 2012-10-10T16:03:16.273 回答
2

您必须为您的类定义一个比较运算符。您的问题不清楚如何确定一个对象是否小于另一个对象。

于 2012-10-10T15:59:47.297 回答
0

尝试这个 ... ....

     void ClassOne::sort(ClassOne *obj,int n)       
     {
      ClassOne temp;
      int i, j;
      for (i = 0; i < n; i++)
      for (j = n - 1; j > i; j--)
        if (obj[j].valueData <obj[j - 1].valueData )
           {
            temp = obj[j];
            obj[j] = obj[j - 1];
            obj[j - 1] = temp;
         }
         }
     ...
      int main()
      {
     ClassOne obj[3],a;
        for(int i=0;i<3;i++)
         obj[i].readdata();
        a.sort(obj,3);
        ...
  }
于 2019-02-08T05:13:57.420 回答