C ++ Class& .H排序

时间:2012-10-10 17:56:52

标签: c++

晚上好专家和大师!!

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

这是 record.h

Class Record
{
private:
string name;
int data;
float valueData;
public:
bool operator<(const Record&) const;
}

并在 record.cpp

创建构造函数

record.cpp我添加了这个

bool Record::operator<(const Record& rhs) const
{
return valueData < rhs.valueData;
}

在main.cpp,我创建了大小为10的记录数组

#include "record.h"

Record rec[10];

我做了

sort(&rec[0], &rec[2]);

但似乎没有任何变化或排序 ..我有3个元素,rec [0],rec [1],rec [2]我希望对它们进行排序,但它们是另一个头文件record.h&amp;它的record.cpp如上所述。

原始问题 接下来是我为对象录制了几个值

现在rec得到3个索引

rec[0]
name = "jack1"
data = 1
valueData = 20

rec[1]
name = "jack2"
data = 2
valueData = 15

rec[2]
name = "jack3"
data = 3
valueData = 25

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

rec[2]然后rec[0]然后rec[1] ..

但我想按类数组对象排序。并重新安排价值,我如何实现这一目标。

3值是私有的,所以我不知道在哪里创建sort函数,在main.cpp或record.cpp,接下来是我如何对它进行排序,以便它可以通过以下方式输出..

-- Highest to lowest --
1) Name: Jack3, Data = 3, Value =25
2) Name: Jack1 , Data =1 , Value = 20
3) Name: Jack2, Data = 2, Value = 15

感谢所有帮助和指导!!

2 个答案:

答案 0 :(得分:2)

请改为:

sort(&rec[0], &rec[3]);

您只是对前两个元素进行排序,因为按惯例由迭代器对定义的范围中的第二个迭代器始终指向一个您想要操作的范围的结尾。

答案 1 :(得分:0)

std::sort与比较两个Record的内容结合使用。至少有3种方法可以提供这种比较。

1:在operator<上实施Record

class Record
{
public:
  bool operator<(const Record& rhs) const
  {
    return valueData < rhs.valurData;
  }
};

...然后:

sort(&rec[0], &rec[10]);

2:提供functor

struct compare_records : public std::binary_function<bool, Record, Record>
{
  bool operator()(const Record& lhs, const Record& rhs) const
  { 
    return lhs.valueData < rhs.valueData;
  }
};

...然后:

sort_if(&rec[0], &rec[10], compare_records());

3 :(如果你有一个C ++ 11编译器)使用lambda:

sort_if(&rec[0], &rec[10], [](const Record& lhs, const Record& rhs) -> bool
{
  return lhs.vaklueData < rhs.valueData;
});

编辑:

以下是一个完整的示例,展示了如何使用第一种方法:

#include <cstdlib>
#include <map>
#include <algorithm>
using namespace std;

class Record
{
public:
    string name;
    int data;
    float valueData;
public:
    bool operator<(const Record& rhs) const
    {
        return valueData < rhs.valueData;
    }
};

int main()
{
    Record rec[10];
    rec[0].name = "jack1";
    rec[0].data = 1;
    rec[0].valueData = 20;

    rec[1].name = "jack2";
    rec[1].data = 2;
    rec[1].valueData = 15;

    rec[2].name = "jack3";
    rec[2].data = 3;
    rec[2].valueData = 25;

    sort(&rec[0], &rec[3]);

    bool bk = true;
}