bind1st和bind2end说明
#include
#include
#include
template< class iterator, class predicate, class doer>
void for_each_if( iterator itFirst, iterator itLast, predicate pred, doer do_it)
{
while ( itFirst != itLast)
{
if ( pred( *itFirst)) do_it( *itFirst);
++itFirst;
}
}
void print( int i) { std::cout << i << " "; }
int main(int argc, char* argv[])
{
int aNumbers[] = { 10, 5, 89, 9, 30, -2, -8, 7, 33, 25, 30, 76, 0, 2};
int nCount = sizeof( aNumbers) / sizeof( aNumbers[ 0]);
// a < b
std::cout << "/nNumbers less than 30: ";
for_each_if( aNumbers, aNumbers + nCount,
std::bind2nd( std::less< int>(), 30), print);
std::cout << "/nNumbers bigger than 30: ";
// a > b
for_each_if( aNumbers, aNumbers + nCount,
std::bind1st( std::less< int>(), 30), print);
std::cout << "/nNumbers less or equal than 30: ";
// a <= b <=> !(a > b)
for_each_if( aNumbers, aNumbers + nCount,
std::not1( std::bind1st( std::less< int>(), 30)), print);
std::cout << "/nNumbers bigger or equal than 30: ";
// a >= b <=> !(a < b)
for_each_if( aNumbers, aNumbers + nCount,
std::not1( std::bind2nd( std::less< int>(), 30)), print);
return 0;
}
下面是一个类属函数示例,将删除所有小等于最小值或大等于最大值的元素:
// 删除所有满足'x <= least' 或 'x >= biggest'条件的元素
template< class iterator, class value_type, class predicate>
iterator remove_least_and_biggest(
iterator itFirst, iterator itLast,
value_type least, value_type biggest, predicate pred)
{
// 删除所有x <= least的元素
iterator itAfterRemovingLeast =
std::remove_if( itFirst, itLast,
std::not1( std::bind1st( pred, least)));
// 删除所有x >= biggest的元素
iterator itNewLast =
std::remove_if( itFirst, itAfterRemovingLeast,
std::not1( std::bind2nd( pred, biggest)));
return itNewLast;
}
如果进行忽略大小写字母的字符串比较,可用以下代码:
bool case_insensitive( const std::string & first, const std::string & second)
{ /* 代码 */ }
std::string aStrs[] = { "john", "John Doe", "Mircea", "nicole", "Nicole
Kidman", "Abraham", "Zeek" };
int n = sizeof( aStrs) / sizeof( aStrs[ 0]);
std::vector< std::string> a( aStrs, aStrs + n);
std::copy( a.begin(), a.end(),
std::ostream_iterator< std::string>( std::cout, ", "));
std::cout << std::endl;
// 删除不是"John Doe", "Mircea", "nicole"的所有元素
a.erase( remove_least_and_biggest(
a.begin(), a.end(), "John", "nicole kidman",
std::ptr_fun(case_insensitive)), a.end());
std::copy( a.begin(), a.end(),
std::ostream_iterator< std::string>( std::cout, ", "));