【问题标题】:sorting and extracting elements from the vector从向量中排序和提取元素
【发布时间】:2011-08-05 09:49:06
【问题描述】:

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

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

我可以使用 partial_sort_copy 或 upper_bound/lower_bound 函数来实现吗?

我正在使用 VS2008

【问题讨论】:

  • 为什么你需要对向量进行排序,而不是只循环一次,在你遍历的时候提取你需要的人?

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


【解决方案1】:

听起来您需要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函数。

【讨论】:

  • 非常感谢。我正在使用仿函数,以便我也可以比较其他参数
猜你喜欢
  • 2017-02-10
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 2022-08-14
  • 2013-02-08
  • 2013-07-12
  • 2014-12-15
  • 1970-01-01
相关资源
最近更新 更多