#include <algorithm>
#include <iostream>
#include <iterator>
#include <list>
#include <map>
#include <string>

typedef std::pair<int, std::string> InputPair;
typedef std::map<int, std::string> InputContainer;
typedef std::list<std::string> OutputContainer;

void copyPart_Ver1( OutputContainer& oc, const InputContainer& ic )
{
	for( InputContainer::const_iterator it=ic.begin(); it!=ic.end(); ++it )
	{
		oc.push_back(it->second);
	}
}

struct TakeSecond
{
	std::string operator()( const InputPair& p ) const
	{
		return p.second;
	}
};

void copyPart_Ver2( OutputContainer& oc, const InputContainer& ic )
{
	std::transform(ic.begin(), ic.end(), std::back_inserter(oc), TakeSecond() );
}

int main() {

	InputContainer ic;
	
	ic[1] = "one";
	ic[2] = "two";

	std::ostream_iterator<std::string> oi( std::cout, " " );

	OutputContainer oc1;
	copyPart_Ver1( oc1, ic );
	std::copy( oc1.begin(), oc1.end(), oi );
	std::cout << std::endl;
	
	OutputContainer oc2;
	copyPart_Ver2( oc2, ic );
	std::copy( oc2.begin(), oc2.end(), oi );	
	std::cout << std::endl;

	return 0;
}