#include <algorithm>
#include <cassert>
#include <vector>
#include <boost/lambda/bind.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/shared_ptr.hpp>
struct Person
{
Person(const int id) : m_id(id) {}
int GetId() const { return m_id; }
private:
int m_id;
};
const std::vector<int> ExtractIds1(const std::vector<Person>& v)
{
std::vector<int> w;
std::transform(
v.begin(),
v.end(),
std::back_inserter(w),
boost::lambda::bind(&Person::GetId, boost::lambda::_1)
);
return w;
}
const std::vector<int> ExtractIds2(const std::vector<Person*>& v)
{
std::vector<int> w;
std::transform(
v.begin(),
v.end(),
std::back_inserter(w),
boost::lambda::bind(&Person::GetId, boost::lambda::_1)
);
return w;
}
const std::vector<int> ExtractIds3(const std::vector<boost::shared_ptr<Person> >& v)
{
std::vector<int> w;
std::transform(
v.begin(),
v.end(),
std::back_inserter(w),
boost::lambda::bind(&Person::GetId, *boost::lambda::_1) //Note the asterisk
);
return w;
}
int main()
{
{
std::vector<Person> v;
v.push_back(Person(1));
v.push_back(Person(4));
v.push_back(Person(9));
v.push_back(Person(6));
const std::vector<int> w = ExtractIds1(v);
assert(w.size() == 4);
assert(w[0] == 1);
assert(w[1] == 4);
assert(w[2] == 9);
assert(w[3] == 6);
}
{
std::vector<Person*> v;
v.push_back(new Person(1));
v.push_back(new Person(4));
v.push_back(new Person(9));
v.push_back(new Person(6));
const std::vector<int> w = ExtractIds2(v);
assert(w.size() == 4);
assert(w[0] == 1);
assert(w[1] == 4);
assert(w[2] == 9);
assert(w[3] == 6);
delete v[0];
delete v[1];
delete v[2];
delete v[3];
}
{
std::vector<boost::shared_ptr<Person> > v;
v.push_back(boost::shared_ptr<Person>(new Person(1)));
v.push_back(boost::shared_ptr<Person>(new Person(4)));
v.push_back(boost::shared_ptr<Person>(new Person(9)));
v.push_back(boost::shared_ptr<Person>(new Person(6)));
const std::vector<int> w = ExtractIds3(v);
assert(w.size() == 4);
assert(w[0] == 1);
assert(w[1] == 4);
assert(w[2] == 9);
assert(w[3] == 6);
}
}
|