2011-03-11 43 views
3

對於這些對象的任何屬性,是否可以輕鬆地對對象類型指針的向量進行排序?在C++中,對於這些對象的任何屬性,是否可以輕鬆地對對象類型指針的向量進行排序?

比方說students爲對象類型指針的載體,當對象studentStudent類型,有兩種方法student.studentAlias()student.studentName()。我怎樣才能對矢量的別名進行排序?

在此先感謝。

+0

此主題描述了一個解決方案:http://stackoverflow.com/questions/1380463/sorting-a-vector-of-custom-objects – luke 2011-03-11 15:10:00

+0

相關:http://stackoverflow.com/questions/5085231/c-選擇-argmax-over-vector-of-classes-wrt-arbitrary-expression/5085323#5085323 – 2011-03-11 15:16:35

回答

13

您可以使用仿函數:

#include <vector> 
#include <algorithm> 

class StudentAliasComparator 
{ 
public: 
    bool operator()(const Student* left, const Student* right) const 
    { 
     return left->studentAlias() < right->studentAlias(); 
    } 
}; 

void SortVectorOfStudentByAlias(std::vector<Student*>& students) 
{ 
    std::sort(students.begin(), students.end(), StudentAliasComparator()); 
} 

你也可以使用拉姆達無論是從提升,或從langage(如果你使用的C++ 0x)。隨着的C++ 0x語法,它會像(不能檢查,因爲我沒有訪問C++編譯器,支持C++ 0x中現在):

void SortVectorOfStudentByAlias(std::vector<Student*>& students) 
{ 
    std::sort(students.begin(), students.end(), 
     [](const Student* l, const Student* r) { 
      return l->studentAlias() < r->studentAlias(); }) 
} 
+0

非常感謝你的解釋。 – katafantas 2011-03-11 17:38:15

5

您可以用排序的std ::排序算法:

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

只需提供一個函數對象(COMP)執行比比較對您所感興趣的屬性不太

2

使用std::mem_fun和包裝:

#include <algorithm> 
#include <functional> 

template <typename F> 
struct CompareBy 
{ 
    bool operator()(const typename F::argument_type& x, 
        const typename F::argument_type& y) 
    { return f(x) < f(y); } 

    CompareBy(const F& f) : f(f) {} 

private: 
    F f; 
}; 

template <typename F> 
CompareBy<F> by(const F& f) { return CompareBy<F>(f); } 

,並進行排序,請

std::vector<Student*> students; 

std::sort(students.begin(), students.end(), 
      by(std::mem_fun(&Student::studentAlias)) 
); 

如果你想通過成員變量進行排序,不幸的是沒有std::mem_ptr。使用我的回答there的想法建立自己的想法。

+0

@coward downvoter:你能解釋一下嗎? – 2011-03-11 15:54:28

+0

非常感謝您的熱心幫助。 – katafantas 2011-03-11 17:36:38

相關問題