2012-10-25 44 views
0

我有類,這個類包含一個數字。而且我有一個vector包含類的對象指針。我想根據它們的數量對這些對象進行排序。我怎樣才能做到這一點? 感謝您的回答。包含對象的矢量的排序元素

#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 << ' '; 
    } 
} 

例如,當我想排序他們正在按他們的地址排序的對象。

+0

「*我有一個向量包含類的對象*」 - 不,它不。你的向量包含指向對象的指針,而不是對象。 –

+1

@ user1559792 - 要「接受」答案,請點擊答案旁邊的複選標記。要「回覆」答案,請單擊答案旁邊的向上三角形。我認爲你還沒有接受任何答案。 –

+0

哦,我不知道。我認爲「有幫助」的按鈕是正確的。 – user1559792

回答

0

您可以通過三種方式做到這一點:

1)過載<運營商,並調用的std ::排序算法。該代碼將是這樣的:

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

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

第一種方式是錯誤的,因爲你不能在指針超載<操作。

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)創建一個比較類,它有它的()運營商超載,然後調用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頭文件中找到。

+0

您是否注意到OP有*指針向量*,而不是*對象*向量? –

+0

這些簽名需要爲OP的代碼採用'Course *',並且我假定它們應該是'Course const&',否則匹配'operator <'? – Useless

+1

-1除了作爲指針向量的向量之外,您不會將類名作爲參數傳遞給'sort'。 –

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; 

應該足夠了。

+0

或'std :: sort(cor.begin(),cor。end(),comparer());' –