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


6.2 Cartesian-product indirection

The Cartesian product of the sets I, J and K is the set of (i,j,k) tuples for which i is in I, j is in J, and k is in K.

Blitz++ implements cartesian-product indirection using an adaptor which takes a set of STL containers and iterates through their Cartesian product. Note that the cartesian product is never explicitly created. You create the Cartesian-product adaptor by calling the function:

template<class T_container>
indexSet(T_container& c1, T_container& c2, ...)

The returned adaptor can then be used in the [] operator of an array object.

Here is a two-dimensional example:

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

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

  J.push_back(0);
  J.push_back(2);
  J.push_back(5);

  A[indexSet(I,J)] = B;

After this code, the A array contains:

 0   0   0   0   0   0
10   0  12   0   0  15
20   0  22   0   0  25
 0   0   0   0   0   0
40   0  42   0   0  45
 0   0   0   0   0   0

All the containers used in a cartesian product must be the same type (e.g. all vector<int> or all set<TinyVector<int,2> >), but they may be different sizes. Singleton containers (containers containing a single value) are fine.