Iterators and STLΒΆ

Standard iterators are provided that model the boost Mutable_ForwardIterator and ForwardIterator concepts (and hence are STL compliant).

The iterator implements also two additional methods :

  • it can be casted to a bool: it is true iif the iteration is not at end.
  • it.indices(): returns const & to the indices at the point of the iteration.

Examples:

array<long,2> A (2,3);
for (auto it = A.begin(); it; ++it) *it =it.indices()[0] + 10 *it.indices()[1];

Some examples of usage:

#include <triqs/arrays.hpp>
#include <vector>
#include <map>
#include <algorithm>
using triqs::arrays::array;
using triqs::arrays::matrix;
using triqs::clef::placeholder;
int main() {

  // For example, one can make a vector of arrays ... ::

  array<long, 2> A(2, 3);
  std::vector<array<long, 2>> VV;
  VV.push_back(A);

  //  ... or a map ::
  std::map<int, array<long, 2>> MAP;
  MAP[1] = A;

  //  We can put a std::vector in an array ... ::
  // --> should make a direct constructor for this.. + factory in the reverse direction...
  std::vector<int> V(10, 2);
  array<int, 1> B(V.size()), C(V.size());
  std::copy(V.begin(), V.end(), B.begin());

  //  ... or in reverse ::
  B *= 2;
  std::copy(B.begin(), B.end(), V.begin());

  //  ... or use other algorithms of std::
  std::cout << " max(B) " << *std::max_element(B.begin(), B.end()) << std::endl;

  // or replace
  placeholder<0> i_;
  B(i_) << 3 * i_;
  std::cout << " B " << B << std::endl;
  std::replace_if(B.begin(), B.end(), [](int i) { return i > 21; }, 0);
  std::cout << " B " << B << std::endl;
}