kutuzzzov

Урок 7-1 Move итераторы

Jan 18th, 2023
314
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.64 KB | None | 0 0
  1. #include <cassert>
  2. #include <iostream>
  3. #include <numeric>
  4. #include <vector>
  5. #include <deque>
  6.  
  7. using namespace std;
  8.  
  9. template <typename RandomIt>
  10. void MakeJosephusPermutation(RandomIt first, RandomIt last, uint32_t step_size) {
  11.     deque<typename RandomIt::value_type> pool(make_move_iterator(first), make_move_iterator(last));
  12.     size_t cur_pos = 0;
  13.     while (!pool.empty()) {
  14.         *(first++) = move(pool[cur_pos]);
  15.         pool.erase(move(pool.begin() + cur_pos));
  16.         if (pool.empty()) {
  17.             break;
  18.         }
  19.         cur_pos = (cur_pos + step_size - 1) % pool.size();
  20.     }
  21. }
  22.  
  23. vector<int> MakeTestVector() {
  24.     vector<int> numbers(10);
  25.     iota(begin(numbers), end(numbers), 0);
  26.     return numbers;
  27. }
  28.  
  29. void TestIntVector() {
  30.     const vector<int> numbers = MakeTestVector();
  31.     {
  32.         vector<int> numbers_copy = numbers;
  33.         MakeJosephusPermutation(begin(numbers_copy), end(numbers_copy), 1);
  34.         assert(numbers_copy == numbers);
  35.     }
  36.     {
  37.         vector<int> numbers_copy = numbers;
  38.         MakeJosephusPermutation(begin(numbers_copy), end(numbers_copy), 3);
  39.         assert(numbers_copy == vector<int>({0, 3, 6, 9, 4, 8, 5, 2, 7, 1}));
  40.     }
  41. }
  42.  
  43. // Это специальный тип, который поможет вам убедиться, что ваша реализация
  44. // функции MakeJosephusPermutation не выполняет копирование объектов.
  45. // Сейчас вы, возможно, не понимаете как он устроен, однако мы расскажем
  46. // об этом далее в нашем курсе
  47.  
  48. struct NoncopyableInt {
  49.     int value;
  50.  
  51.     NoncopyableInt(const NoncopyableInt&) = delete;
  52.     NoncopyableInt& operator=(const NoncopyableInt&) = delete;
  53.  
  54.     NoncopyableInt(NoncopyableInt&&) = default;
  55.     NoncopyableInt& operator=(NoncopyableInt&&) = default;
  56. };
  57.  
  58. bool operator==(const NoncopyableInt& lhs, const NoncopyableInt& rhs) {
  59.     return lhs.value == rhs.value;
  60. }
  61.  
  62. ostream& operator<<(ostream& os, const NoncopyableInt& v) {
  63.     return os << v.value;
  64. }
  65.  
  66. void TestAvoidsCopying() {
  67.     vector<NoncopyableInt> numbers;
  68.     numbers.push_back({1});
  69.     numbers.push_back({2});
  70.     numbers.push_back({3});
  71.     numbers.push_back({4});
  72.     numbers.push_back({5});
  73.  
  74.     MakeJosephusPermutation(begin(numbers), end(numbers), 2);
  75.  
  76.     vector<NoncopyableInt> expected;
  77.     expected.push_back({1});
  78.     expected.push_back({3});
  79.     expected.push_back({5});
  80.     expected.push_back({4});
  81.     expected.push_back({2});
  82.  
  83.     assert(numbers == expected);
  84. }
  85.  
  86. int main() {
  87.     TestIntVector();
  88.     TestAvoidsCopying();
  89. }
Add Comment
Please, Sign In to add comment