#include #include #include #include bool cmp_abs(int i, int j); void printArray( std::vector::const_iterator first, std::vector::const_iterator last ); class CmpMod { int m; public: CmpMod(int mm = 5): m(mm) {} bool operator()(int i0, int i1) const { int r0 = i0 % m; if (r0 < 0) r0 += m; int r1 = i1 % m; if (r1 < 0) r1 += m; return (r0 < r1); } }; int main() { std::vector a = { 1, -10, 22, 36, -57, 102, 17, 19, 28, 15, 12, 18, -121, 343, -561 }; std::cout << "Initial array:" << std::endl; printArray(a.cbegin(), a.cend()); std::cout << "----" << std::endl; std::vector b = a; std::sort(b.begin(), b.end()); std::cout << "Sorted by value:" << std::endl; printArray(b.cbegin(), b.cend()); std::cout << "----" << std::endl; b = a; std::sort(b.begin(), b.end(), cmp_abs); std::cout << "Sorted by absolute value:" << std::endl; printArray(b.cbegin(), b.cend()); std::cout << "----" << std::endl; b = a; int m = 10; std::sort(b.begin(), b.end(), CmpMod(10)); std::cout << "Sorted by residues modulo " << m << ":" << std::endl; printArray(b.cbegin(), b.cend()); std::cout << "----" << std::endl; return 0; } bool cmp_abs(int i0, int i1) { return (abs(i0) < abs(i1)); } void printArray( std::vector::const_iterator first, std::vector::const_iterator last ) { int i = 0; while (first != last) { if (i > 0) { // Print a delimiter if (i%5 == 0) std::cout << std::endl; else std::cout << " "; } std::cout << *first; ++first; ++i; } std::cout << std::endl; }