fork(2) download
  1. #include <algorithm>
  2. #include <chrono>
  3. #include <iostream>
  4. #include <iterator>
  5. #include <list>
  6. #include <map>
  7. #include <string>
  8. #include <utility>
  9. #include <numeric>
  10. #include <vector>
  11.  
  12.  
  13. template<typename T, typename K>
  14. std::vector<K> sum_elements(const T& beg, const T& end, std::size_t k, K def)
  15. {
  16. if (k == 0) {
  17. return std::vector<K>{};
  18. }
  19. return sum_elements(beg, end, k, def, [](auto &l, auto &r){ return r+l;});
  20. }
  21.  
  22. template<typename T, typename K, class BinaryOp>
  23. std::vector<K>
  24. sum_elements(
  25. const T& beg,
  26. const T& end,
  27. std::size_t k,
  28. K def,
  29. BinaryOp op)
  30. {
  31. std::vector<K> out;
  32. out.reserve((std::distance(beg, end) - 1)/k + 1);
  33. for (auto it = beg; it!=end; std::advance(it, std::min(static_cast<std::size_t>(std::distance(it, end)), k)))
  34. {
  35. out.push_back(std::accumulate(it, std::next(it, std::min(static_cast<std::size_t>(std::distance(it, end)), k)), def, op));
  36. }
  37. return out;
  38. }
  39.  
  40. int main()
  41. {
  42. std::vector<int> vec;
  43. auto size = 1000000;
  44. vec.reserve(size);
  45. for (int i=0; i < size; ++i)
  46. vec.push_back(i);
  47. auto beg = std::chrono::system_clock::now();
  48. auto sum = 0;
  49. for (int i=0; i < 100; i++)
  50. sum += sum_elements(vec.begin(), vec.end(), 2, 0).size();
  51. auto end = std::chrono::system_clock::now();
  52. std::cout << std::chrono::duration_cast<std::chrono::microseconds>(end-beg).count() << std::endl;
  53. std::cout << sum << std::endl;
  54.  
  55. return sum;
  56. }
  57.  
Runtime error #stdin #stdout 0.11s 17328KB
stdin
Standard input is empty
stdout
112809
50000000