In my last article have seen how we can leverage C++ STL to do selection sort on the vector of integers only. However, the selection sort wasn't very generic to accept vectors of any basic type and sort accordingly.

The below program was an effort to make the same selection sort (ascending order) implementation for vectors of any type like vectors of integers, doubles, chars, etc.

#include < iostream >

#include < algorithm >

#include < vector >

template < class ForwardIterator1, class ForwardIterator2 >

void iters_swap (ForwardIterator1 a, ForwardIterator2 b)

{

std::swap (*a, *b);

}

template < typename T >

void selectionSort(std::vector< T > &v)

{

// Selection sort

typedef typename std::vector::value_type vt;

typename std::vector::iterator it = v.begin();

while(it != v.end())

{

typename std::vector::iterator i_Min = std::min_element(it, v.end());

iters_swap(i_Min, it);

++it;

}

}

int main()

{

// Case 1: Vector of ints

int arr[] = {34, 20, 99, 10, 23};

std::vector v(std::begin(arr), std::end(arr));

// Before sorting

for (std::vector::const_iterator i = v.begin(); i != v.end(); ++i)

{

std::cout << *i << ' ';

}

std::cout << std::endl;

selectionSort(v);

// After sorting

for (std::vector::const_iterator iSort = v.begin(); iSort != v.end(); ++iSort)

{

std::cout << *iSort << ' ';

}

std::cout << std::endl;

// Case 2: Vector of doubles

double arrd[] = {23.23, 19.01, 19, 5.04, 15.56, 23};

std::vector vd(std::begin(arrd), std::end(arrd));

// Before sorting

for (std::vector::const_iterator i = vd.begin(); i != vd.end(); ++i)

{

std::cout << *i << ' ';

}

std::cout << std::endl;

selectionSort(vd);

// After sorting

for (std::vector::const_iterator iSort = vd.begin(); iSort != vd.end(); ++iSort)

{

std::cout << *iSort << ' ';

}

std::cout << std::endl;

// Case 3: Vector of chars

char carr[] = {'c','z','w','f','n','p','g'};

std::vector vc(std::begin(carr), std::end(carr));

// Before sorting

for (std::vector::const_iterator i = vc.begin(); i != vc.end(); ++i)

{

std::cout << *i << ' ';

}

std::cout << std::endl;

selectionSort(vc);

// After sorting

for (std::vector::const_iterator iSort = vc.begin(); iSort != vc.end(); ++iSort)

{

std::cout << *iSort << ' ';

}

std::cout << std::endl;

return 0;

}

Output:

Note: The highlighted STL function std::min_element(), sorts the vector in ascending order. If we want to sort it in descending order, replace std::min_element() with std::max_element(). That's it.

The below program was an effort to make the same selection sort (ascending order) implementation for vectors of any type like vectors of integers, doubles, chars, etc.

#include < iostream >

#include < algorithm >

#include < vector >

template < class ForwardIterator1, class ForwardIterator2 >

void iters_swap (ForwardIterator1 a, ForwardIterator2 b)

{

std::swap (*a, *b);

}

template < typename T >

void selectionSort(std::vector< T > &v)

{

// Selection sort

typedef typename std::vector

typename std::vector

while(it != v.end())

{

typename std::vector

iters_swap(i_Min, it);

++it;

}

}

int main()

{

// Case 1: Vector of ints

int arr[] = {34, 20, 99, 10, 23};

std::vector

// Before sorting

for (std::vector

{

std::cout << *i << ' ';

}

std::cout << std::endl;

selectionSort(v);

// After sorting

for (std::vector

{

std::cout << *iSort << ' ';

}

std::cout << std::endl;

// Case 2: Vector of doubles

double arrd[] = {23.23, 19.01, 19, 5.04, 15.56, 23};

std::vector

// Before sorting

for (std::vector

{

std::cout << *i << ' ';

}

std::cout << std::endl;

selectionSort(vd);

// After sorting

for (std::vector

{

std::cout << *iSort << ' ';

}

std::cout << std::endl;

// Case 3: Vector of chars

char carr[] = {'c','z','w','f','n','p','g'};

std::vector

// Before sorting

for (std::vector

{

std::cout << *i << ' ';

}

std::cout << std::endl;

selectionSort(vc);

// After sorting

for (std::vector

{

std::cout << *iSort << ' ';

}

std::cout << std::endl;

return 0;

}

Output:

Note: The highlighted STL function std::min_element(), sorts the vector in ascending order. If we want to sort it in descending order, replace std::min_element() with std::max_element(). That's it.

## Comments