0

私にはクラスがあり、このクラスには番号が含まれています。そして、私はベクトルにクラスのオブジェクトポインタが含まれています。そして、そのオブジェクトを番号に従って並べ替えたいと思います。これどうやってするの?回答ありがとうございます。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class Course
{
public:
    Course (int code, string const& name) : name(n), code(c) {}
    int getCourseCode() const { return code; }
    string const& getName() const { return name; }

private:
    string name;
    int code;
};

int main()
{
    vector<Course*> cor;
    vector<Course*>::iterator itcor;

    cor.push_back(new Course(3,"first"));
    cor.push_back(new Course(2,"sekond"));
    cor.push_back(new Course(4,"third"));
    cor.push_back(new Course(1,"fourth"));
    cor.push_back(new Course(5,"fifth"));  
    sort (cor.begin(), cor.end());
    for (itcor=cor.begin(); itcor!=cor.end(); ++itcor) {
        cout << *itcor << ' ';
    }
}

たとえば、オブジェクトを並べ替える場合は、アドレスに従って並べ替えます。

4

2 に答える 2

4

std::sortアドレスでソートされないように、カスタムコンパレータクラスまたは関数をメソッドに提供する必要があります。

template <class RandomAccessIterator, class Compare>
void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );

ここで、comp次のように定義できます。

bool comparer(const Course* x, const Course* y) { /*compare*/ }
//or
struct comparer {
  bool operator() (const Course* x, const Course* y) { /*compare*/ }
} comparerObject;

次のように並べ替えを呼び出します。

std::sort(cor.begin(), cor.end(), comparer);   //method alternative

また

std::sort(cor.begin(), cor.end(), comparerObject);   //class alternative

それ、またはポインタをに保持しないでくださいvector。投稿したコードから、実際にポインタが必要かどうかは明らかではありません。

vector<Course> cor;

十分なはずです。

于 2012-10-25T15:57:48.330 に答える
0

これは、次の3つの方法で実行できます。

1)<演算子をオーバーロードし、std::sortアルゴリズムを呼び出します。コードは次のようになります。

bool operator<(Course *a, Course *b) const {
  // do comparison
  return A_BOOL_VALUE;
}

std::sort(array_of_courses.begin(),array_of_courses.end());

ポインタの<演算子をオーバーロードできないため、最初の方法は間違っています。

2)比較関数を作成してから、の2番目のバージョンを呼び出しますstd::sort。コードは次のようになります。

bool compare(Course *a,Course *b) {
  // do comparison
  return A_BOOL_VALUE;
}

std::sort(array_of_courses.begin(),array_of_courses.end(),compare);

3)演算子がオーバーロードされた比較クラスを作成してから()、の3番目のバージョンを呼び出しますstd::sort。コード:

struct Compare {
  bool operator()(Course *a, Course *b) {
    // do comparison
    return A_BOOL_VALUE;
  }
};

std::sort(array_of_courses.begin(),array_of_courses.end(),Compare);

注:ソート機能はalgorithmヘッダーファイルにあります。

于 2012-10-25T16:05:06.207 に答える