fork download
  1. #include <iostream>
  2.  
  3. unsigned long concatenateArr_Sone( unsigned* first, unsigned* last )
  4. {
  5. unsigned long value = 0,
  6. ct = 1;
  7.  
  8. while( last-- != first )
  9. {
  10. if( *last > 9 )
  11. {
  12. value += ct * (*last % 10);
  13. *last++ /= 10;
  14. }
  15. else
  16. value += ct * *last;
  17.  
  18. ct *= 10;
  19. }
  20.  
  21. return value;
  22. }
  23.  
  24. unsigned long append_number(unsigned long x, unsigned y) {
  25. return (y < 10 ? x : append_number(x, y / 10)) * 10 + y % 10;
  26. }
  27.  
  28. #include <numeric>
  29.  
  30. unsigned long concatenateArr_Seldon( unsigned* first, unsigned* last )
  31. {
  32. return std::accumulate(first, last, 0ul, append_number);
  33. }
  34.  
  35. #include <iterator>
  36. #include <random>
  37. #include <algorithm>
  38. #include <iomanip>
  39. #include <chrono>
  40. #include <ctime>
  41.  
  42. unsigned arr[5];
  43.  
  44. template<typename Callable>
  45. void check( std::string const& name, Callable&& Foo )
  46. {
  47. std::cout << '\n' << name << ": " << Foo( std::begin(arr), std::end(arr) ) << ", needed ";
  48.  
  49. using namespace std::chrono;
  50. auto _tp = system_clock::now();
  51. unsigned long val;
  52.  
  53. for( unsigned ct = 0; ct < 10000000; ++ct )
  54. val = Foo( std::begin(arr), std::end(arr) );
  55.  
  56. std::cout << (system_clock::now() - _tp).count() << " ticks, result = " << val;
  57. }
  58.  
  59. int main()
  60. {
  61. std::uniform_int_distribution<unsigned> dist(0, 100);
  62. std::minstd_rand device(time(nullptr));
  63. std::generate( std::begin(arr), std::end(arr), std::bind(dist, device) );
  64.  
  65. std::cout << "Values: ";
  66. std::copy( std::begin(arr), std::end(arr), std::ostream_iterator<unsigned>(std::cout, ", ") );
  67.  
  68. check( "Seldon", concatenateArr_Seldon );
  69. check( "Sone ", concatenateArr_Sone );
  70. }
Success #stdin #stdout 0.7s 3032KB
stdin
Standard input is empty
stdout
Values: 37, 41, 7, 82, 8, 
Seldon: 37417828, needed 554028 ticks, result = 37417828
Sone  : 37417828, needed 148491 ticks, result = 34788