Как скопировать пару списков stl в один, но только с некоторым свойством

У меня есть пара списков указателей на пользовательский класс (класс простой человек с основными данными).
Как скопировать указатели (поверхностное копирование) из всех списков в один новый список, но только лиц, которые из Портленда (город == Портленд)? Я использую список из STL (список). Я не могу использовать C ++ 11.

class Person{
public:
long id;
string name;
string last_name;
string city

};

0

Решение

В C ++ 11 вы должны использовать copy_if и лямбда:

std::list<Person*> src, dst;

std::copy_if(src.cbegin(), src.cend(), std::back_inserter(dst),
[](Person * p) -> bool { return p->city == "Portland"; });

Если у вас более старая платформа (на которой нет лямбд или copy_if), вам придется записать цикл вручную:

for (std::list<Person*>::const_iterator it = src.begin(), e = src.end(); it != e; ++it)
{
if ((*it)->city == "Portland") { dst.push_back(*it); }
}
2

Другие решения

Например, в C ++ 03.

struct PersonComparerByCity : public std::unary_function<Person*, bool>
{
PersonComparerByCity(const std::string& c):city(c) { }
result_type operator() (argument_type arg) const
{ return arg && arg->city == city; }
private:
std::string city;
};

std::list<Person*> p;
std::list<Person*> result;
std::remove_copy_if(p.begin(), p.end(), std::back_inserter(result),
std::not1(PersonComparerByCity("Portland")));

http://liveworkspace.org/code/a8e36e63b1f9924281768d90f7a090da

2

По вопросам рекламы [email protected]