C++ 从向量中排序和提取元素

C++ 从向量中排序和提取元素,c++,visual-c++,stl,C++,Visual C++,Stl,问题: 我有一个类CPerson,它的成员变量是年龄和分数。我已经创建了一个人的向量,并填充了对象。现在我只想提取得分为100分的人 我的方法: 我尝试根据标记对向量进行排序,然后循环遍历向量,找到100的第一个位置,然后再次循环,直到标记不同。这里的问题是我需要手动操作。如果我想按年龄搜索,那么我需要重复同样的算法。还有别的办法吗 我可以使用部分排序复制或上界/下界函数来实现它 我使用的是VS2008听起来您需要如果删除复制

问题: 我有一个类CPerson,它的成员变量是年龄和分数。我已经创建了一个人的向量,并填充了对象。现在我只想提取得分为100分的人

我的方法: 我尝试根据标记对向量进行排序,然后循环遍历向量,找到100的第一个位置,然后再次循环,直到标记不同。这里的问题是我需要手动操作。如果我想按年龄搜索,那么我需要重复同样的算法。还有别的办法吗

我可以使用部分排序复制或上界/下界函数来实现它


我使用的是VS2008

听起来您需要
如果
删除复制
功能,该功能最好命名为
copy\u if\u not
。不幸的是,STL中缺少
copy\u 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);
}

当然,如果要调整标记阈值,可以使用函子而不是
HasNotScoredHundred
函数。

听起来您需要
remove\u copy\u if
函数,如果不
,最好将其命名为
copy\u。不幸的是,STL中缺少
copy\u 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);
}

当然,如果你想调整标记阈值,你可以使用一个函子而不是
HasNotScoredHundred
函数。

为什么你需要对向量排序,而不仅仅是循环一次,在遍历时提取你需要的人?为什么你需要对向量排序,而不仅仅是循环一次,在你经历的过程中提取你需要的人?非常感谢。我使用函子,这样我可以比较其他参数,也非常感谢你。我使用函子,这样我也可以比较其他参数