2012-03-14 56 views
3

可能重复:
How to use std::sort with a vector of structures and compare function?排序对象的属性对象的矢量

我有一只猫对象(什么?),和这显然排序猫对象catSort对象。以下是类

class cat { 
public: 
    int age; 
}; 

class catSorter { 
public: 
    vector<cat> cats; 
    vector<cat> SortCatsByAge(); 
    void AddCat(cat new_cat); 
}; 

void catSorter::AddCat(cat new_cat){ 
    this->cats.push_back(new_cat) 
} 

vector<cat> catSorter::SortCatsByAge(){ 
    // Sort cats here by age! 
} 


cat tim; 
tim.age = 10; 

cat mark; 
mark.age = 20 

cat phil; 
phil.age = 3; 

catSorter sorter; 
sorter->AddCat(tim); 
sorter->AddCat(mark); 
sorter->AddCat(phil); 

std::<vector> sortedcats = sorter->SortCatsByAge(); 

我在排序矢量时遇到困难,我该如何去做这件事?我是否应该循环访问cats属性并将它们存储在临时向量中,然后返回该属性?有没有更简单的方法来做到这一点?

+0

[查找了std :: sort](http://msdn.microsoft.com/en-us/library/ecdecxh1(v = vs.80).aspx)你会想用一个谓词来告诉它如何对'cat'对象。 – 2012-03-14 17:03:17

回答

11

你应该实现在猫的operator<让猫可以排序:

class cat { 
public: 
    int age; 
    bool operator< (const cat &other) const { 
     return age < other.age; 
    } 
}; 

然后,您可以包括“算法”的头和阵列上使用std::sort

vector<cat> catSorter::SortCatsByAge(){ 
    vector<cat> cats_copy = cats; 
    std::sort(cats_copy.begin(), cats_copy.end()); 
    return cats_copy; 
} 
+1

如果您无法访问'cat'类,或者您想根据不同目的按不同属性进行排序,该怎么办? – 2013-11-03 22:31:50

+0

@DrewNoakes您可以将'operator <'定义为一个自由函数或提供一个自定义比较函数作为'std :: sort'的第三个参数。 – mfontanini 2013-11-03 22:51:01

+0

为什么要'std :: sort(cats_copy.begin(),cats_copy.end());'按年龄排序?毛皮长度或猫的名字如何按字母顺序排列? – Jonny 2016-04-04 06:14:47