1 // spreadsort string functor reverse sorting example. 2 // 3 // Copyright Steven Ross 2009-2014. 4 // 5 // Distributed under the Boost Software License, Version 1.0. 6 // (See accompanying file LICENSE_1_0.txt or copy at 7 // http://www.boost.org/LICENSE_1_0.txt) 8 9 // See http://www.boost.org/libs/sort for library home page. 10 11 #include <boost/sort/spreadsort/string_sort.hpp> 12 #include <time.h> 13 #include <stdio.h> 14 #include <stdlib.h> 15 #include <algorithm> 16 #include <vector> 17 #include <iostream> 18 #include <fstream> 19 #include <string> 20 using std::string; 21 using namespace boost::sort::spreadsort; 22 23 struct DATA_TYPE { 24 string a; 25 }; 26 27 struct greaterthan { operator ()greaterthan28 inline bool operator()(const DATA_TYPE &x, const DATA_TYPE &y) const { 29 return x.a > y.a; 30 } 31 }; 32 33 struct bracket { operator ()bracket34 inline unsigned char operator()(const DATA_TYPE &x, size_t offset) const { 35 return x.a[offset]; 36 } 37 }; 38 39 struct getsize { operator ()getsize40 inline size_t operator()(const DATA_TYPE &x) const{ return x.a.size(); } 41 }; 42 43 //Pass in an argument to test std::sort main(int argc,const char ** argv)44 int main(int argc, const char ** argv) { 45 std::ifstream indata; 46 std::ofstream outfile; 47 bool stdSort = false; 48 unsigned loopCount = 1; 49 for (int u = 1; u < argc; ++u) { 50 if (std::string(argv[u]) == "-std") 51 stdSort = true; 52 else 53 loopCount = atoi(argv[u]); 54 } 55 double total = 0.0; 56 //Run multiple loops, if requested 57 std::vector<DATA_TYPE> array; 58 for (unsigned u = 0; u < loopCount; ++u) { 59 indata.open("input.txt", std::ios_base::in | std::ios_base::binary); 60 if (!indata) { 61 printf("input.txt could not be opened\n"); 62 return 1; 63 } 64 DATA_TYPE inval; 65 indata >> inval.a; 66 while (!indata.eof() ) { 67 array.push_back(inval); 68 //Inserting embedded nulls and empty strings 69 if (!(array.size() % 100)) { 70 if (inval.a.empty() || !(array.size() % 1000)) { 71 inval.a = ""; 72 array.push_back(inval); 73 } 74 else { 75 inval.a[0] = '\0'; 76 array.push_back(inval); 77 } 78 } 79 indata >> inval.a; 80 } 81 82 indata.close(); 83 clock_t start, end; 84 double elapsed; 85 start = clock(); 86 if (stdSort) 87 std::sort(array.begin(), array.end(), greaterthan()); 88 else 89 reverse_string_sort(array.begin(), array.end(), bracket(), getsize(), 90 greaterthan()); 91 end = clock(); 92 elapsed = static_cast<double>(end - start); 93 if (stdSort) 94 outfile.open("standard_sort_out.txt", std::ios_base::out | 95 std::ios_base::binary | std::ios_base::trunc); 96 else 97 outfile.open("boost_sort_out.txt", std::ios_base::out | 98 std::ios_base::binary | std::ios_base::trunc); 99 if (outfile.good()) { 100 for (unsigned u = 0; u < array.size(); ++u) 101 outfile << array[u].a << "\n"; 102 outfile.close(); 103 } 104 total += elapsed; 105 array.clear(); 106 } 107 if (stdSort) 108 printf("std::sort elapsed time %f\n", total / CLOCKS_PER_SEC); 109 else 110 printf("spreadsort elapsed time %f\n", total / CLOCKS_PER_SEC); 111 return 0; 112 } 113