include
#include <utility>
#include <iostream>
#include <string>
#include <iterator>
Test Demo
template< std::size_t _ArrayLength, typename _Ty >
std::ostream& operator<<( std::ostream& out, _Ty ( &array )[ _ArrayLength ] ){
std::copy( std::begin( array ),
std::end( array ),
std::ostream_iterator< _Ty >( out, "|") );
return out;
}
int main( void ){
char charSeq[ 10 ] = "aaabbbccc";
puts( R"PRIM(charSeq before remove letter 'c' )PRIM" );
std::cout << charSeq << std::flush;
std::endl( std::cout );
erase_if(charSeq,
[&]( char& c )->bool
{ return ( c == 'b' ); },
'*');
puts( R"PRIM(charSeq after remove letter 'c' )PRIM" );
std::cout << charSeq << std::flush;
std::endl( std::cout );
int intSeq[ 6 ] = { 1, 1, 2, 2, 3, 3, };
puts( R"PRIM(intSeq before remove number 2 )PRIM" );
std::cout << intSeq << std::flush;
std::endl( std::cout );
erase_if(intSeq,
[&]( decltype(intSeq[0]) i )->bool
{ return ( i == 2 ); },
-1);
puts( R"PRIM(intSeq after remove number 2 )PRIM" );
std::cout << intSeq << std::flush;
std::endl( std::cout );
return 0;
}
output result
erase_if( calling remove_if & range_set )
template < std::size_t _ArrayLength, typename _Ty, typename _UnaryPredicate >
std::size_t erase_if( _Ty ( &array )[ _ArrayLength ], _UnaryPredicate p, _Ty default_value ){
std::size_t _Res { 0 };
range_set( ( _Ty * )array +
( _Res = remove_if( array, p )),
( _Ty * )array + _ArrayLength,
default_value );
return _Res;
}
remove_if ( calling find_if )
template < std::size_t _ArrayLength, typename _Ty, typename _UnaryPredicate >
std::size_t remove_if( _Ty ( &array )[ _ArrayLength ], _UnaryPredicate p ){
std::size_t first = find_if( array, p),
last = _ArrayLength;
if( first == last ) return last;
for( std::size_t iter { first }; !( ++iter == last ); ){
_Ty& __ref_ = *( ( _Ty *)array + iter );
if( !p( __ref_ ) )
array[ first++ ] = std::move( __ref_ );
}
return first;
}
range_set
template < typename _Ty >
inline void range_set( _Ty *begIt, _Ty *endIt, _Ty val){
while( !( begIt == endIt ) ) *begIt++ = val;
}
find_if
template < std::size_t _ArrayLength, typename _Ty, typename _UnaryPredicate >
std::size_t find_if( _Ty ( &array )[ _ArrayLength ], _UnaryPredicate p ){
std::size_t first { 0 };
for( ; !( first == _ArrayLength )
&& !p( *( ( _Ty *)array + first ) )
; ++first ) { }
return first;
}