Go back to Richel Bilderbeek's homepage.

Go back to Richel Bilderbeek's C++ page.

 

 

 

 

 

(C++) ExtractIds

 

ExtractIds is a container code snippet to extract a certain data type from multiple complex class instances.

 

ExtractIds extracts the integer called ID from multiple Person class instances stored in a std::vector. Note that the container the Persons are stored in will support the example code below.

 

#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);
  }
}

 

 

 

 

 

Go back to Richel Bilderbeek's C++ page.

Go back to Richel Bilderbeek's homepage.

 

Valid XHTML 1.0 Strict