fork(1) download
  1. #include <iostream>
  2. #include <vector>
  3. #include <array>
  4. #include <iterator>
  5. using namespace std;
  6.  
  7. template<class T>
  8. struct slice {
  9. T* data;
  10. std::size_t const* stride;
  11. slice operator[](std::size_t I)const {
  12. return{ data + I* *stride, stride + 1 };
  13. }
  14. operator T&()const { return *data; }
  15. T& operator=(T in) { *data = std::move(in); return *data; }
  16. };
  17.  
  18.  
  19. template<class T>
  20. struct buffer {
  21. std::vector<T> data_;
  22. std::vector<std::size_t> strides_;
  23.  
  24. buffer(std::vector<std::size_t> sizes) :strides_(sizes) {
  25. std::size_t scale = 1;
  26. for (std::size_t i = 0; i < sizes.size(); ++i) {
  27. auto next = strides_[sizes.size() - 1 - i] * scale;
  28. strides_[sizes.size() - 1 - i] = scale;
  29. scale = next;
  30. }
  31. data_.resize(scale);
  32. }
  33. const std::vector<std::size_t>& strides() const { return strides_; };
  34. T* data() { return data_.data(); }
  35. slice<T> get() { return{ data_.data(), strides_.data() }; }
  36. slice<T> operator[](std::size_t I) { return get()[I]; }
  37.  
  38. };
  39.  
  40. int main() {
  41. // your code goes here
  42. buffer<int> b({ 2,5,3 });
  43.  
  44. for (int i = 0; i < 2; i++)
  45. {
  46. for (int j = 0; j < 5; j++)
  47. {
  48. for (int k = 0; k < 3; k++)
  49. {
  50. b[i][j][k] = 3 * (5 * (i)+j) + k + 1;
  51. }
  52. }
  53. }
  54. copy(b.data(), b.data() + 2 * 5 * 3, ostream_iterator<int>(cout, " "));
  55. return 0;
  56. }
Success #stdin #stdout 0s 4356KB
stdin
Standard input is empty
stdout
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30