2011-08-05 35 views
0

問題: 我有一個CPerson類,它的成員變量是Age和Marks。我創造了一個人的矢量,並填充了物體。現在我只想提取已經拿到100分的人。排序和從矢量中提取元素

我的方法: 我試圖排序基於標記的載體,然後通過矢量循環找到100的第一個位置,然後再次循環,直到標記是不同的。這裏的問題是我需要手動完成。 Tommorow如果我想按年齡搜索,那麼我需要重複相同的算法。有沒有其他方法可以做到這一點?

我可以使用partial_sort_copy或upper_bound/lower_bound函數來實現它。

我使用VS2008

+6

爲什麼您需要對矢量進行排序,而不是一次循環遍歷它,在您瀏覽時抽取需要的人員? –

回答

5

這聽起來像你需要的remove_copy_if功能,可以更好地命名爲copy_if_not。不幸的是,STL缺少copy_if函數。

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

typedef int CPerson; 

bool HasNotScoredHundred(const CPerson & person) 
{ 
    return person < 100; 
} 

void Print(const CPerson & person) 
{ 
    cout << person << " "; 
} 

int main() 
{ 
    vector<CPerson> people; 
    people.push_back(CPerson(50)); 
    people.push_back(CPerson(150)); 
    people.push_back(CPerson(100)); 
    people.push_back(CPerson(0)); 

    vector<CPerson> elite; 
    remove_copy_if 
     (people.begin() 
     , people.end() 
     , back_inserter(elite) 
     , HasNotScoredHundred 
     ); 

    for_each(people.begin(), people.end(), Print); 
    cout << "\n"; 
    for_each(elite.begin(), elite.end(), Print); 
} 

輸出:

50 150 100 0 
150 100 

當然,如果你想調整標記的閾值,你可以使用一個仿函數,而不是HasNotScoredHundred功能。

+0

非常感謝。我正在使用函子,以便我可以比較其他參數 – Jeeva