#include <iostream>
#include <iomanip>
#include <vector>
using Inner = std::vector<int>;
using Outer = std::vector<Inner>;
std::ostream& operator <<(std::ostream& os, const Inner& row)
{
for (auto col : row)
std::cout << col << ' ';
return os;
}
std::ostream& operator <<(std::ostream& os, const Outer& tbl)
{
for (auto const& row : tbl)
std::cout << row << '\n';
return os;
}
int main()
{
Inner inner;
for (int i=1; i<=10; ++i)
inner.emplace_back(i);
Outer outer(10, inner);
// iterators
for (auto row = outer.begin(); row != outer.end(); ++row)
{
for (auto col = row->begin(); col != row->end(); ++col)
std::cout << *col << ' ';
std::cout.put('\n');
}
std::cout.put('\n');
// ranged-for
for (auto const& row : outer)
{
for (auto col : row)
std::cout << col << ' ';
std::cout.put('\n');
}
std::cout.put('\n');
// stream overloads
std::cout << outer << '\n';
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KI2luY2x1ZGUgPHZlY3Rvcj4KCnVzaW5nIElubmVyID0gc3RkOjp2ZWN0b3I8aW50PjsKdXNpbmcgT3V0ZXIgPSBzdGQ6OnZlY3RvcjxJbm5lcj47CgpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yIDw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IElubmVyJiByb3cpCnsKICAgIGZvciAoYXV0byBjb2wgOiByb3cpCiAgICAgICAgc3RkOjpjb3V0IDw8IGNvbCA8PCAnICc7CiAgICByZXR1cm4gb3M7Cn0KCnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3IgPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgT3V0ZXImIHRibCkKewogICAgZm9yIChhdXRvIGNvbnN0JiByb3cgOiB0YmwpCiAgICAgICAgc3RkOjpjb3V0IDw8IHJvdyA8PCAnXG4nOwogICAgcmV0dXJuIG9zOwp9CgppbnQgbWFpbigpCnsKICAgIElubmVyIGlubmVyOwogICAgZm9yIChpbnQgaT0xOyBpPD0xMDsgKytpKQogICAgICAgIGlubmVyLmVtcGxhY2VfYmFjayhpKTsKICAgIAogICAgT3V0ZXIgb3V0ZXIoMTAsIGlubmVyKTsKICAgIAogICAgLy8gaXRlcmF0b3JzCiAgICBmb3IgKGF1dG8gcm93ID0gb3V0ZXIuYmVnaW4oKTsgcm93ICE9IG91dGVyLmVuZCgpOyArK3JvdykKICAgIHsKICAgICAgICBmb3IgKGF1dG8gY29sID0gcm93LT5iZWdpbigpOyBjb2wgIT0gcm93LT5lbmQoKTsgKytjb2wpCiAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAqY29sIDw8ICcgJzsKICAgICAgICBzdGQ6OmNvdXQucHV0KCdcbicpOwogICAgfQogICAgc3RkOjpjb3V0LnB1dCgnXG4nKTsKICAgIAogICAgLy8gcmFuZ2VkLWZvcgogICAgZm9yIChhdXRvIGNvbnN0JiByb3cgOiBvdXRlcikKICAgIHsKICAgICAgICBmb3IgKGF1dG8gY29sIDogcm93KQogICAgICAgICAgICBzdGQ6OmNvdXQgPDwgY29sIDw8ICcgJzsKICAgICAgICBzdGQ6OmNvdXQucHV0KCdcbicpOwogICAgfQogICAgc3RkOjpjb3V0LnB1dCgnXG4nKTsKICAgIAogICAgLy8gc3RyZWFtIG92ZXJsb2FkcwogICAgc3RkOjpjb3V0IDw8IG91dGVyIDw8ICdcbic7Cn0K