Advertisement
chevengur

СПРИНТ № 8 | Семантика перемещения | Урок 4: Функция move и другие перемещения

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