Next: , Up: Indirection   [Contents][Index]


6.1 Indirection using lists of array positions

The simplest kind of indirection uses a list of points. For one-dimensional arrays, you can just use an STL container of integers. Example:

  Array<int,1> A(5), B(5);
  A = 0;
  B = 1, 2, 3, 4, 5;

  vector<int> I;
  I.push_back(2);
  I.push_back(4);
  I.push_back(1);

  A[I] = B;

After this code, the array A contains [ 0 2 3 0 5 ].

Note that arrays on the right-hand-side of the assignment must have the same shape as the array on the left-hand-side (before indirection). In the statement A[I] = B, A and B must have the same shape, not I and B.

For multidimensional arrays, you can use an STL container of TinyVector<int,N_rank> objects. Example:

  Array<int,2> A(4,4), B(4,4);
  A = 0;
  B = 10*tensor::i + tensor::j;

  typedef TinyVector<int,2> coord;

  list<coord> I;
  I.push_back(coord(1,1));
  I.push_back(coord(2,2));

  A[I] = B;

After this code, the array A contains:

  0   0   0   0
  0  11   0   0
  0   0  22   0
  0   0   0   0

(The tensor::i notation is explained in the section on index placeholders Index placeholders).