#include <iostream>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <boost/phoenix/core.hpp>
#include <boost/phoenix/bind.hpp>
#include <boost/phoenix/operator/comparison.hpp>
#include <boost/phoenix/stl/algorithm/transformation.hpp>
#include <functional>
#include <string>
#include <vector>
std::vector< std::string > make_list() {
std::vector< std::string > list;
list.push_back( "duck" );
list.push_back( "duck" );
list.push_back( "goose" );
return list;
}
bool IsGoose( const std::string& s )
{
return s == "goose";
}
void delete_value1(std::vector< std::string > &list )
{
list.erase( std::remove_if( list.begin(), list.end(), IsGoose ), list.end() );
}
void out_string(const std::string &s)
{
std::cout << s << std::endl;
}
void show_list1( const std::vector< std::string > &list )
{
std::for_each(list.begin(), list.end(), out_string);
}
bool isValue(const std::string &s1, const std::string &s2)
{
return s1==s2;
}
void delete_value2(std::vector< std::string > &list, const std::string & value)
{
list.erase(
std::remove_if(
list.begin(),
list.end(),
boost::bind(
isValue, _1, boost::cref( value ) ) ),
list.end() );
}
namespace phx = boost::phoenix;
using phx::placeholders::arg1;
using phx::placeholders::arg2;
void delete_value3(std::vector< std::string > &list, const std::string & value)
{
list.erase( std::remove_if(
list.begin(),
list.end(),
arg1 == phx::cref( value ) ),
list.end() );
}
void delete_value4(std::vector< std::string > &list, const std::string & value)
{
list.erase( phx::remove_if( arg1, arg2 )
( list, arg1 == phx::cref( value ) ),
list.end() );
}
int main() {
std::cout << "--------------------------------" << std::endl;
std::cout << "Delete the goose examples." << std::endl;
std::cout << "--------------------------------" << std::endl;
std::string value = "goose";
std::vector< std::string > list1 = make_list();
delete_value1(list1);
show_list1(list1);
std::cout << "--------------------------------" << std::endl;
std::vector< std::string > list2 = make_list();
delete_value2(list2,value);
show_list1(list2);
std::cout << "--------------------------------" << std::endl;
std::vector< std::string > list3 = make_list();
delete_value3(list3,value);
show_list1(list3);
std::cout << "--------------------------------" << std::endl;
std::vector< std::string > list4 = make_list();
delete_value4(list4,value);
show_list1(list4);
std::cout << "--------------------------------" << std::endl;
return 0;
}