fork(1) download
  1. #include <cassert>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. template <typename ELEM>
  6. class NDArrayT {
  7. private:
  8. // dimensions
  9. std::vector<size_t> _dims;
  10. // data
  11. std::vector<ELEM> _data;
  12.  
  13. public:
  14. NDArrayT(const std::vector<size_t> &dims):
  15. _dims(dims)
  16. {
  17. size_t size = _dims.empty() ? 0 : 1;
  18. for (size_t dim : _dims) size *= dim;
  19. _data.resize(size);
  20. }
  21. NDArrayT(
  22. const std::vector<size_t> &dims,
  23. const std::vector<ELEM> &data):
  24. NDArrayT<ELEM>(dims)
  25. {
  26. assert(_data.size() == data.size());
  27. std::copy(data.begin(), data.end(), _data.begin());
  28. }
  29.  
  30. ELEM& operator[](const std::vector<size_t> &indices)
  31. {
  32. size_t i = 0, j = 0;
  33. for (size_t n = _dims.size(); j < n; ++j) {
  34. i *= _dims[j]; i += indices[j];
  35. }
  36. return _data[i];
  37. }
  38.  
  39. const ELEM& operator[](const std::vector<size_t> &indices) const
  40. {
  41. size_t i = 0, j = 0;
  42. for (size_t n = _dims.size(); j < n; ++j) {
  43. i *= _dims[j]; i += indices[j];
  44. }
  45. return _data[i];
  46. }
  47. };
  48.  
  49. using namespace std;
  50.  
  51. ostream& operator<<(ostream &out, const vector<size_t> &values)
  52. {
  53. const char *sep = "";
  54. for (size_t value : values) {
  55. out << sep << value; sep = ", ";
  56. }
  57. return out;
  58. }
  59.  
  60. bool inc(vector<size_t> &indices, const vector<size_t> &dims)
  61. {
  62. for (size_t i = indices.size(); i--;) {
  63. if (++indices[i] < dims[i]) return false;
  64. indices[i] = 0;
  65. }
  66. return true; // overflow
  67. }
  68.  
  69. int main()
  70. {
  71. // build sample data
  72. vector<double> data(2 * 3 * 4);
  73. for (size_t i = data.size(); i--;) data[i] = (double)i;
  74. // build sample array
  75. typedef NDArrayT<double> NDArrayDouble;
  76. const vector<size_t> dims = { 2, 3, 4 };
  77. NDArrayDouble a(dims, data);
  78. // print sample array (check subscript)
  79. vector<size_t> indices(dims.size(), 0);
  80. do {
  81. cout << "a[" << indices << "]: " << a[indices] << endl;
  82. } while (!inc(indices, dims));
  83. // done
  84. return 0;
  85. }
Success #stdin #stdout 0s 4428KB
stdin
Standard input is empty
stdout
a[0, 0, 0]: 0
a[0, 0, 1]: 1
a[0, 0, 2]: 2
a[0, 0, 3]: 3
a[0, 1, 0]: 4
a[0, 1, 1]: 5
a[0, 1, 2]: 6
a[0, 1, 3]: 7
a[0, 2, 0]: 8
a[0, 2, 1]: 9
a[0, 2, 2]: 10
a[0, 2, 3]: 11
a[1, 0, 0]: 12
a[1, 0, 1]: 13
a[1, 0, 2]: 14
a[1, 0, 3]: 15
a[1, 1, 0]: 16
a[1, 1, 1]: 17
a[1, 1, 2]: 18
a[1, 1, 3]: 19
a[1, 2, 0]: 20
a[1, 2, 1]: 21
a[1, 2, 2]: 22
a[1, 2, 3]: 23