0

こんばんは専門家と教祖!!

以下を記録する配列オブジェクトがあります。

これは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とその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の値はプライベートなので、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

すべての助けとガイドをありがとう!

4

2 に答える 2

2

代わりにこれを行ってください:

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

慣例によりイテレータペアによって定義された範囲内の2番目のイテレータは、操作する範囲の終わりを常に1つ超えているため、最初の2つの要素のみを並べ替えていました。

于 2012-10-10T18:41:25.933 に答える
0

std::sort2つのを比較するものと組み合わせて使用​​しRecordます。この比較を提供するには、少なくとも3つの方法があります。

operator<1:オンを実装しRecordます:

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

...それから:

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

2:ファンクターを提供します:

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コンパイラを使用している場合)ラムダを使用します:

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;
}
于 2012-10-10T18:12:20.730 に答える