сортировка и извлечение элементов из вектора - PullRequest
0 голосов
/ 05 августа 2011

Проблема: У меня есть класс CPerson, переменными-членами которого являются Age и Marks. Я создал вектор людей и населен объектами. Теперь я хочу извлечь только тех, кто набрал 100 баллов.

Мой подход: Я попытался отсортировать вектор на основе меток, а затем прошел через вектор, чтобы найти первую позицию 100, а затем снова повторил цикл, пока метки не станут другими. Проблема здесь в том, что мне нужно сделать это вручную. Завтра, если я хочу искать по возрасту, мне нужно повторить тот же алгоритм. Есть ли другой способ сделать это?

Могу ли я использовать для этого функцииpartal_sort_copy или upper_bound / lower_bound.

Я использую VS2008

1 Ответ

5 голосов
/ 05 августа 2011

Звучит так, будто вам нужна функция remove_copy_if, которую лучше назвать copy_if_not. К сожалению, функция copy_if отсутствует в STL.

#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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...