fork download
  1. #include <algorithm>
  2. #include <cstdio>
  3. #include <ctime>
  4. #include <iterator>
  5. #include <type_traits>
  6. #include <vector>
  7.  
  8. #if 0
  9. namespace std
  10. {
  11. template<class FwdIt, class C>
  12. back_insert_iterator<C> copy(
  13. FwdIt begin, FwdIt end, back_insert_iterator<C> it,
  14. forward_iterator_tag * =
  15. static_cast<typename iterator_traits<FwdIt>::iterator_category *>(0))
  16. {
  17. struct It : public back_insert_iterator<C>
  18. {
  19. using back_insert_iterator<C>::container;
  20. static C &deref(C &c) { return c; }
  21. static C &deref(C *c) { return *c; }
  22. };
  23. copy(begin, end, inserter(It::deref(static_cast<It &>(it).container),
  24. It::deref(static_cast<It &>(it).container).end()));
  25. return it;
  26. }
  27.  
  28. template<class FwdIt, class C>
  29. typename enable_if< // Only do this if it would be exception-safe!
  30. has_nothrow_copy_constructor<typename C::value_type>::value &&
  31. has_nothrow_assign<typename C::value_type>::value,
  32. insert_iterator<C>
  33. >::type copy(
  34. FwdIt const &begin, FwdIt const &end,
  35. insert_iterator<C> output,
  36. forward_iterator_tag * = // only forward iterators
  37. static_cast<typename iterator_traits<FwdIt>::iterator_category *>(0))
  38. {
  39. struct It : public insert_iterator<C>
  40. {
  41. using insert_iterator<C>::container; // protected -> public
  42. using insert_iterator<C>::iter; // protected -> public
  43. static C &deref(C &c) { return c; }
  44. static C &deref(C *c) { return *c; }
  45. };
  46. It &it(static_cast<It &>(output));
  47. typename C::iterator it_iter_end(It::deref(it.container).end());
  48. {
  49. // Convert iterators to offsets
  50. typename C::size_type const iter_end_off =
  51. std::distance(It::deref(it.container).begin(), it_iter_end);
  52. typename iterator_traits<typename C::iterator>::difference_type off
  53. = std::distance(It::deref(it.container).begin(), it.iter);
  54.  
  55. // Resize container
  56. It::deref(it.container).resize(
  57. It::deref(it.container).size() +
  58. static_cast<typename C::size_type>(std::distance(begin, end)));
  59.  
  60. // Renormalize, in case invalidated
  61. it.iter = It::deref(it.container).begin();
  62. std::advance(it.iter, off);
  63. it_iter_end = It::deref(it.container).begin();
  64. std::advance(it_iter_end, iter_end_off);
  65. }
  66. typename C::iterator result
  67. = copy_backward(it.iter, it_iter_end, It::deref(it.container).end());
  68. copy_backward(begin, end, result);
  69. return inserter(It::deref(it.container), result);
  70. }
  71. }
  72. #endif
  73.  
  74. int main()
  75. {
  76. std::vector<unsigned char> x;
  77. x.resize(1000000);
  78. clock_t begin = clock();
  79. long long totalMS = 0;
  80. for (int i = 0; i < 100; i++)
  81. {
  82. std::vector<unsigned char> y; y.reserve(x.size());
  83. std::copy(x.begin(), x.end(), std::back_inserter(y));
  84. }
  85. clock_t end = clock();
  86. printf("%d\n", (int)((end - begin) * 1000 / CLOCKS_PER_SEC));
  87. }
Success #stdin #stdout 0.49s 2884KB
stdin
Standard input is empty
stdout
490