Как реализовать отображение, фильтрацию и свертывание в C++ 98

Я хочу иметь возможность сделать что-то вроде:

std::list<Person> personList;

std::list<Person> filteredPersonList;

Person filterByAge(Person p){
  if(p.age >= 18) return p;
}

filteredPersonList = filter(personList, filterByAge)

person prog keys    schedule 06.04.2015    source источник
comment
Я не вижу никаких ограничений относительно c++98 для std::list<>::remove_if .   -  person πάντα ῥεῖ    schedule 06.04.2015


Ответы (2)


Я думаю, вы ищете remove_copy_if:

std::list<Person> personList;

std::list<Person> filteredPersonList;

Person filterByAge(Person p){
  if(p.age >= 18) return false;
}

std::remove_copy_if(personList.begin(), personList.end(), std::inserter(filteredPersonList, filteredPersonList.end()), filterByAge);
person Mark B    schedule 06.04.2015

Только для записи:

template< 
        class IN_TYPE, 
        template < class IN_TYPE, class A = std::allocator< IN_TYPE > > class COLLECTION
> COLLECTION< IN_TYPE > filter (const COLLECTION< IN_TYPE >& collection, bool (*f) ( const IN_TYPE& ) )
{
    COLLECTION< IN_TYPE > result;

    typename COLLECTION< IN_TYPE >::const_iterator it;

    //std::copy_if( collection.begin(), collection.end(), result.begin(), f );
    for( it = collection.begin() ; it != collection.end() ; ++it )
    {
        IN_TYPE node = *it;
        bool passedFilter = f(node);

        if (passedFilter)
            result.push_back(node);
    }

    return result;
}
person prog keys    schedule 09.04.2015