fork download
  1. #include <algorithm>
  2. #include <functional>
  3. #include <iostream>
  4. #include <iterator>
  5.  
  6. template<class BiDirIt, class Compare = std::less<>>
  7. void merge_sort(BiDirIt first, BiDirIt last, Compare cmp = Compare{})
  8. {
  9. auto const N = std::distance(first, last);
  10. if (N <= 1) return;
  11. auto const middle = std::next(first, N / 2);
  12. merge_sort(first, middle, cmp); // assert(std::is_sorted(first, middle, cmp));
  13. merge_sort(middle, last, cmp); // assert(std::is_sorted(middle, last, cmp));
  14. std::inplace_merge(first, middle, last, cmp); // assert(std::is_sorted(first, last, cmp));
  15. }
  16.  
  17. class int_buffer {
  18. public:
  19. explicit int_buffer(size_t size); // size_t is defined in cstdlib
  20. int_buffer(const int* source, size_t size);
  21. int_buffer(const int_buffer& rhs); // copy construct
  22. int_buffer(int_buffer&& rhs); // move construct
  23. int_buffer & operator=(const int_buffer& rhs); // copy assign
  24. int_buffer & operator=(int_buffer&& rhs); // move assign
  25. size_t size() const;
  26. int* begin();
  27. int* end();
  28. const int* begin() const;
  29. const int* end() const;
  30. ~int_buffer();
  31. private:
  32. int* buffer;
  33. size_t bufferSize;
  34. };
  35.  
  36. int_buffer::int_buffer(size_t size) :buffer(new int[size]), bufferSize(size) {
  37. }
  38.  
  39. int_buffer::int_buffer(const int* source, size_t size) : buffer(new int[size]), bufferSize(size) {
  40. for (int i = 0; i < size; i++) {
  41. buffer[i] = source[i];
  42. }
  43. }
  44.  
  45. int_buffer::int_buffer(const int_buffer& rhs) :buffer(new int[rhs.size()]), bufferSize(rhs.size()) {
  46. std::copy(rhs.begin(), rhs.end(), begin());
  47. }
  48.  
  49. int_buffer::int_buffer(int_buffer&& rhs) {
  50. buffer = rhs.buffer;
  51. bufferSize = rhs.size();
  52. rhs.buffer = nullptr;
  53. }
  54.  
  55. int_buffer& int_buffer::operator=(const int_buffer& rhs) {
  56. if (buffer == rhs.begin()) {
  57. return *this;
  58. }
  59. else if (bufferSize == rhs.size()) {
  60. std::copy(rhs.begin(), rhs.end(), begin());
  61. return *this;
  62. }
  63. else {
  64. delete[]buffer;
  65. buffer = new int[rhs.size()];
  66. bufferSize = rhs.size();
  67. std::copy(rhs.begin(), rhs.end(), begin());
  68. return *this;
  69. }
  70. return *this;
  71. }
  72.  
  73. int_buffer& int_buffer::operator=(int_buffer&& rhs) {
  74. if (this != &rhs) {
  75. delete[]buffer;
  76. this->buffer = rhs.buffer;
  77. rhs.buffer = nullptr;
  78. }
  79. return *this;
  80. }
  81.  
  82.  
  83. size_t int_buffer::size() const {
  84. return bufferSize;
  85. }
  86.  
  87. int* int_buffer::begin() {
  88. return buffer;
  89. }
  90.  
  91. int* int_buffer::end() {
  92. return buffer + bufferSize;
  93. }
  94.  
  95. const int* int_buffer::begin() const {
  96. return buffer;
  97. }
  98.  
  99. const int* int_buffer::end() const {
  100. return buffer + bufferSize;
  101. }
  102.  
  103. int_buffer::~int_buffer() {
  104. delete[]buffer;
  105. }
  106.  
  107. using namespace std;
  108. void fill(int_buffer &buffer);
  109.  
  110. int main(int argc, const char * argv[]) {
  111. int_buffer buffer(10);
  112. fill(buffer);
  113. merge_sort(buffer.begin(), buffer.end());
  114. std::cout << "\n";
  115. std::copy(buffer.begin(), buffer.end(), std::ostream_iterator<int>(std::cout, " "));
  116.  
  117. return 0;
  118. }
  119.  
  120. void fill(int_buffer &buffer) {
  121. int value = 0;
  122. for (int *i = buffer.begin(); i != buffer.end(); i++) {
  123. value = rand() % 10;
  124. *i = value;
  125. }
  126.  
  127. for (const int* i = buffer.begin(); i != buffer.end(); i++) {
  128. std::cout << *i << std::endl;
  129. }
  130. }
  131.  
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
3
6
7
5
3
5
6
2
9
1

1 2 3 3 5 5 6 6 7 9