问题: 我有一个CPerson类,其成员变量是Age和Marks。我创建了一个人物矢量,并填充了这些物体。现在我想只提取得分为100分的人。
我的方法: 我试图根据标记对矢量进行排序,然后在矢量中循环以找到100的第一个位置,然后再循环直到标记不同。这里的问题是我需要手动完成。 Tommorow如果我想按年龄搜索,那么我需要重复相同的算法。还有其他办法吗?
我可以使用partial_sort_copy或upper_bound / lower_bound函数来实现它。
我正在使用VS2008
答案 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
函数。