Just thought I'd comment further on Jonathan's excellent answer.
Ignore the c++11 syntax for now and imagine that we had written some supporting classes (doesn't matter how for now).
we could conceivably come up with code like this:
auto main() -> int
{
    // define a matrix (vector of vectors)
    IMat mat;
    // resize it through some previously defined function
    resize(mat, 10, 10);
    // get an object that is a pseudo-container representing its extent
    auto extent = extent_of(mat);
    // generate values in the pseudo-container which forwards to the matrix
    std::generate(extent.begin(), 
                  extent.end(), 
                  [](auto pxy) { pxy.set_value(pxy.x * pxy.y); });
    // or even
    for (auto pxy : extent_of(mat)) {
        pxy.set_value(product(pxy.coordinates()));
    }
    return 0;
}
100 lines of supporting code later (iterable containers and their proxies are not trivial) and this would compile and work.
Clever as it undoubtedly would be, there are some problems:
- There's the small matter of the 100 extra lines of code.
 
- It seems to me that this code is actually less expressive than yours. i.e. it's immediately obvious what your code is doing. With mine you have to make some assumptions or go and reason about the extra 100 lines of code.
 
- my code needs a lot more maintenance (and documentation) than yours
 
Sometimes less is more.