Currently, it is not possible to use range-based for to loop over the entries of a BCRSMatrix object. That is because the iterator provided by the matrix row has a method 'index', which returns the current matrix column, and this method is not accessible from a range-based for loop. As a consequence, normal iterator loops have to to be used, which make the code clumsy.
Now C++17 has brought structured binding, which offers a very elegant
way around the problem. There is a proposal in
dune-common for a global method
'sparseRange', which turns an iterator range with a custom iterator.
This iterator, when dereferenced, returns std::pair<reference,int>.
Hence it is possible to write
for (auto [entry, i] : sparseRange(matrixRow)) std::cout << "column " << j << " contains " << entry << std::endl;
in lieu of
auto it = matrixRow.begin() auto endIt = matrixRow.end() for (; it!=endIt; ++it) std::cout << "column " << it.index() << " contains " << *it << std::endl;
However, besides the use of the 'index' method there is nothing matrix-specific or dune-istl-specific here.