从向量中排序和提取元素

时间:2011-08-05 09:49:07

标签: c++ visual-c++ stl

问题: 我有一个CPerson类,其成员变量是Age和Marks。我创建了一个人物矢量,并填充了这些物体。现在我想只提取得分为100分的人。

我的方法: 我试图根据标记对矢量进行排序,然后在矢量中循环以找到100的第一个位置,然后再循环直到标记不同。这里的问题是我需要手动完成。 Tommorow如果我想按年龄搜索,那么我需要重复相同的算法。还有其他办法吗?

我可以使用partial_sort_copy或upper_bound / lower_bound函数来实现它。

我正在使用VS2008

1 个答案:

答案 0 :(得分: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函数。