對於這些對象的任何屬性,是否可以輕鬆地對對象類型指針的向量進行排序?在C++中,對於這些對象的任何屬性,是否可以輕鬆地對對象類型指針的向量進行排序?
比方說students
爲對象類型指針的載體,當對象student
是Student
類型,有兩種方法student.studentAlias()
和student.studentName()
。我怎樣才能對矢量的別名進行排序?
在此先感謝。
對於這些對象的任何屬性,是否可以輕鬆地對對象類型指針的向量進行排序?在C++中,對於這些對象的任何屬性,是否可以輕鬆地對對象類型指針的向量進行排序?
比方說students
爲對象類型指針的載體,當對象student
是Student
類型,有兩種方法student.studentAlias()
和student.studentName()
。我怎樣才能對矢量的別名進行排序?
在此先感謝。
您可以使用仿函數:
#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(); })
}
非常感謝你的解釋。 – katafantas 2011-03-11 17:38:15
您可以用排序的std ::排序算法:
template <class RandomAccessIterator, class StrictWeakOrdering>
void sort(RandomAccessIterator first, RandomAccessIterator last, StrictWeakOrdering comp);
只需提供一個函數對象(COMP)執行比比較對您所感興趣的屬性不太
使用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的想法建立自己的想法。
@coward downvoter:你能解釋一下嗎? – 2011-03-11 15:54:28
非常感謝您的熱心幫助。 – katafantas 2011-03-11 17:36:38
此主題描述了一個解決方案:http://stackoverflow.com/questions/1380463/sorting-a-vector-of-custom-objects – luke 2011-03-11 15:10:00
相關:http://stackoverflow.com/questions/5085231/c-選擇-argmax-over-vector-of-classes-wrt-arbitrary-expression/5085323#5085323 – 2011-03-11 15:16:35