• Forum
• Lounge
• A proposal to introduce general function

### A proposal to introduce general functions std::reverse and std::sort

In most cases standard algorithms std::reverse and std::sort (and corresponding member functions of containers std::forward_list and std::list) are called over a whole container.

So I am suggesting to introduce such general functions std::reverse and std::sort that will accept the reference to a container.

Here is a demonstrative code that illustrates the proposal.

 ``123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147`` ``````#include #include #include #include #include #include #include namespace N1 // std { template void reverse( T &c ) { std::reverse( std::begin( c ), std::end( c ) ); } template void reverse( std::forward_list &f ) { f.reverse(); } template void reverse( std::list &l ) { l.reverse(); } template void sort( T &c ) { std::sort( std::begin( c ), std::end( c ) ); } template void sort( std::forward_list &f ) { f.sort(); } template void sort( std::list &l ) { l.sort(); } template void sort( T &c, Compare comp ) { std::sort( std::begin( c ), std::end( c ), comp ); } template void sort( std::forward_list &f, Compare comp ) { f.sort( comp ); } template void sort( std::list &l, Compare comp ) { l.sort( comp ); } } // end of N1 int main() { int a[3] = { 1, 2, 3 }; std::forward_list f( std::begin( a ), std::end( a ) ); std::list l( std::begin( a ), std::end( a ) ); std::vector v( std::begin( a ), std::end( a ) ); std::cout << "a:\t"; for ( int x : a ) std::cout << x << ' '; std::cout << std::endl; std::cout << "f:\t"; for ( int x : f ) std::cout << x << ' '; std::cout << std::endl; std::cout << "l:\t"; for ( int x : l ) std::cout << x << ' '; std::cout << std::endl; std::cout << "v:\t"; for ( int x : v ) std::cout << x << ' '; std::cout << std::endl; std::cout << std::endl; N1::reverse( a ); N1::reverse( f ); N1::reverse( l ); N1::reverse( v ); std::cout << "a:\t"; for ( int x : a ) std::cout << x << ' '; std::cout << std::endl; std::cout << "f:\t"; for ( int x : f ) std::cout << x << ' '; std::cout << std::endl; std::cout << "l:\t"; for ( int x : l ) std::cout << x << ' '; std::cout << std::endl; std::cout << "v:\t"; for ( int x : v ) std::cout << x << ' '; std::cout << std::endl; std::cout << std::endl; N1::sort( a ); N1::sort( f ); N1::sort( l ); N1::sort( v ); std::cout << "a:\t"; for ( int x : a ) std::cout << x << ' '; std::cout << std::endl; std::cout << "f:\t"; for ( int x : f ) std::cout << x << ' '; std::cout << std::endl; std::cout << "l:\t"; for ( int x : l ) std::cout << x << ' '; std::cout << std::endl; std::cout << "v:\t"; for ( int x : v ) std::cout << x << ' '; std::cout << std::endl; std::cout << std::endl; N1::sort( a, std::greater() ); N1::sort( f, std::greater() ); N1::sort( l, std::greater() ); N1::sort( v, std::greater() ); std::cout << "a:\t"; for ( int x : a ) std::cout << x << ' '; std::cout << std::endl; std::cout << "f:\t"; for ( int x : f ) std::cout << x << ' '; std::cout << std::endl; std::cout << "l:\t"; for ( int x : l ) std::cout << x << ' '; std::cout << std::endl; std::cout << "v:\t"; for ( int x : v ) std::cout << x << ' '; std::cout << std::endl; std::cout << std::endl; }``````

Last edited on
boost has that already,
 ``123456789101112`` ``````#include #include #include #include int main() { std::string s = "Simpsons did it!"; boost::sort(s); boost::reverse(s); std::cout << s << '\n'; }`````` `tssponmiiiddS! `

(wouldn't work on list/forward_list, though -- boost::sort requires a random-accessible range.. but if you're serious about making a library proposal, work it into boost.range)
Last edited on
Maybe I am mistaken but though it looks similarly it seems that ideas, mine and of the boost, are different. I am going to have general functions std::reverse and std::sort for any class that does not have even iterators, The only requirement they must satisfy is the presence of member functions sort and reverse without parameters or with one parameter denoting a predicate for an overloaded sort member function.
For the demonstrative example I selected the approach used for std:;swap however it would be better to write these general functions based on conditions

std::is_member_function_pointer<decltype( &Container::reverse)>::value
std::is_member_function_pointer<decltype( &Container::sort)>::value
 I am going to have general functions std::reverse and std::sort for any class that does not have even iterators, The only requirement they must satisfy is the presence of member functions sort and reverse

Reminds me of something Stroustrup was talking about when visiting us last year regarding the endless overloads of swap, begin, and end and his crazy plan on how to get rid of them all..

Anyway, if it's different from range, make a new boost library, but chances for it to become widely accepted are pretty low.
Well, the problem that would be resolved by introducing such functions is that without them it is impossible to write a generic code where for example a vector and/or a forward_list can be used.
What I need is to write some appropriate realizations of the functions based on the conditions I pointed out.
Topic archived. No new replies allowed.