fork(1) download
  1. #include<algorithm>
  2. #include<atomic>
  3. #include<array>
  4. #include<chrono>
  5. #include<condition_variable>
  6. #include<cstddef>
  7. #include<ctime>
  8. #include<fstream>
  9. #include<future>
  10. #include<iostream>
  11. #include<iterator>
  12. #include<limits>
  13. #include<memory>
  14. #include<mutex>
  15. #include<numeric>
  16. #include<sstream>
  17. #include<string>
  18. #include<vector>
  19. using namespace std;
  20.  
  21. template<class T>
  22. class Middle
  23. {
  24. public:
  25. using size_type=typename vector<T>::size_type;
  26. private:
  27. vector<T> *vec_;
  28. const size_type column_;
  29. const size_type index_;
  30. public:
  31. Middle(vector<T> &vec,const size_type column,const size_type index) noexcept
  32. :vec_{addressof(vec)},column_{column},index_{index}{}
  33. Middle(const Middle &)=default;
  34. operator T&()
  35. {
  36. return vec_->operator[](index_);
  37. }
  38. Middle& operator=(const Middle &)=delete;
  39. T& operator[](const size_t i)
  40. {
  41. return vec_->operator[](index_*column_+i);
  42. }
  43. };
  44.  
  45. template<class T>
  46. class Const_Middle
  47. {
  48. public:
  49. using size_type=typename vector<T>::size_type;
  50. private:
  51. const vector<T> *vec_;
  52. const size_type column_;
  53. const size_type index_;
  54. public:
  55. Const_Middle(const vector<T> &vec,const size_type column,const size_type index) noexcept
  56. :vec_{addressof(vec)},column_{column},index_{index}{}
  57. Const_Middle(const Const_Middle &)=default;
  58. operator const T&()
  59. {
  60. return vec_->operator[](index_);
  61. }
  62. Const_Middle& operator=(const Const_Middle &)=delete;
  63. const T& operator[](const size_t i)
  64. {
  65. return vec_->operator[](index_*column_+i);
  66. }
  67. };
  68.  
  69. template<class T>
  70. class Test
  71. {
  72. public:
  73. using size_type=typename vector<T>::size_type;
  74. vector<T> vec_;
  75. private:
  76. const size_type column_;
  77. public:
  78. Test(const size_type row,const size_type column)
  79. :column_{column},vec_(row*column){}
  80. Middle<T> operator[](const size_t i)
  81. {
  82. return Middle<T>{vec_,column_,i};
  83. }
  84. Const_Middle<T> operator[](const size_t i) const
  85. {
  86. return Const_Middle<T>{vec_,column_,i};
  87. }
  88. };
  89.  
  90. int main()
  91. {
  92. Test<int> test(3,4);
  93. iota(begin(test.vec_),end(test.vec_),0);
  94. const Test<int> &test2{test};
  95. cout<<test[6]<<endl;
  96. cout<<test[1][1]<<endl;
  97. cout<<test[2][3]<<endl;
  98. cout<<test2[6]<<endl;
  99. cout<<test2[1][1]<<endl;
  100. cout<<test2[2][3]<<endl;
  101. }
Success #stdin #stdout 0s 3468KB
stdin
Standard input is empty
stdout
6
5
11
6
5
11