fork download
  1. #include <iostream>
  2. #include <array>
  3. #include <algorithm>
  4. #include <iterator>
  5. #include <random>
  6.  
  7. static constexpr size_t razmer = 12;
  8.  
  9. template<class T, size_t N>
  10. struct massiv_wrapper
  11. {
  12. T data[N];
  13. };
  14.  
  15. template<class T, size_t N, class... Ts>
  16. struct massiv_guard
  17. {
  18. using massiv_type = T[N];
  19.  
  20. massiv_guard(Ts&& ...args): m_ukazatel{new massiv_wrapper<T, N>(std::forward<Ts>(args)...)} {}
  21. ~massiv_guard() { delete m_ukazatel; }
  22.  
  23. massiv_type& get() { return m_ukazatel->data; }
  24.  
  25. private:
  26. massiv_wrapper<T, N>* m_ukazatel;
  27. };
  28.  
  29. template<size_t N, class T>
  30. std::ostream& operator<< (std::ostream& os, T const (&arr)[N])
  31. {
  32. std::copy(std::begin(arr), std::end(arr), std::ostream_iterator<T>(os, " "));
  33. return os << std::endl;
  34. }
  35.  
  36. template<size_t N, class T, class Fn>
  37. void foreach_pair(T (&arr)[N], Fn&& f)
  38. {
  39. (void)std::adjacent_find(std::begin(arr), std::end(arr), std::forward<Fn>(f));
  40. }
  41.  
  42. int main()
  43. {
  44. auto guard = massiv_guard<int, razmer>();
  45. int (&mas)[razmer] = guard.get();
  46.  
  47. std::random_device rd;
  48. std::default_random_engine e1(rd());
  49. std::uniform_int_distribution<int> uniform_dist(0, 19);
  50. std::generate(std::begin(mas), std::end(mas), [&uniform_dist, &e1]() {
  51. return uniform_dist(e1);
  52. });
  53.  
  54. std::cout << mas;
  55.  
  56. auto swap = [_=0](auto& a, auto& b) mutable {
  57. if (++_%2) { std::swap(a, b); }
  58. return false;
  59. };
  60. foreach_pair(mas, swap);
  61.  
  62. std::cout << mas;
  63. }
Success #stdin #stdout 0s 5416KB
stdin
Standard input is empty
stdout
12 10 2 0 4 6 17 17 17 17 3 12 
10 12 0 2 6 4 17 17 17 17 12 3