У меня есть пара списков указателей на пользовательский класс (класс простой человек с основными данными).
Как скопировать указатели (поверхностное копирование) из всех списков в один новый список, но только лиц, которые из Портленда (город == Портленд)? Я использую список из STL (список). Я не могу использовать C ++ 11.
class Person{
public:
long id;
string name;
string last_name;
string city
};
В 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); }
}
Например, в 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