#include <type_traits>
#include <vector>
#include <iostream>
namespace
{
template <typename Container>
struct value_type_i
{
typedef typename std::decay<
decltype(*std::begin(std::declval<
Container const &
>()))
>::type type;
};
template <typename Container>
using value_type = typename value_type_i<Container>::type;
}
template <typename MatrixType>
MatrixType transpose(MatrixType const & matrix)
{
auto const nrows = matrix.size();
auto const ncols = nrows > 0 ? matrix[0].size() : 0;
MatrixType transposed(ncols, value_type<MatrixType>(nrows));
for(auto k = 0; k < nrows; ++k)
for(auto j = 0; j < ncols; ++j)
transposed[j][k] = matrix[k][j];
return transposed;
}
template <typename T>
void print(T const & t)
{
for(auto const & row : t)
{
for(auto const & col : row)
std::cout << col << ' ';
std::cout << '\n';
}
std::cout << '\n';
}
int main()
{
std::vector<std::vector<int>> A(7, std::vector<int>(9));
int val = 11;
for(auto & row : A)
for(auto & col : row)
col = val++;
print(A);
print(transpose(A));
return 0;
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8aW9zdHJlYW0+CgpuYW1lc3BhY2UKewogICAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KICAgIHN0cnVjdCB2YWx1ZV90eXBlX2kKICAgIHsKICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6ZGVjYXk8CiAgICAgICAgICAgIGRlY2x0eXBlKCpzdGQ6OmJlZ2luKHN0ZDo6ZGVjbHZhbDwKICAgICAgICAgICAgICAgIENvbnRhaW5lciBjb25zdCAmCiAgICAgICAgICAgID4oKSkpCiAgICAgICAgPjo6dHlwZSB0eXBlOwogICAgfTsKCiAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgogICAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIHZhbHVlX3R5cGVfaTxDb250YWluZXI+Ojp0eXBlOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0cml4VHlwZT4KTWF0cml4VHlwZSB0cmFuc3Bvc2UoTWF0cml4VHlwZSBjb25zdCAmIG1hdHJpeCkKewogICAgYXV0byBjb25zdCBucm93cyA9IG1hdHJpeC5zaXplKCk7CiAgICBhdXRvIGNvbnN0IG5jb2xzID0gbnJvd3MgPiAwID8gbWF0cml4WzBdLnNpemUoKSA6IDA7CgogICAgTWF0cml4VHlwZSB0cmFuc3Bvc2VkKG5jb2xzLCB2YWx1ZV90eXBlPE1hdHJpeFR5cGU+KG5yb3dzKSk7CiAgICBmb3IoYXV0byBrID0gMDsgayA8IG5yb3dzOyArK2spCiAgICAgICAgZm9yKGF1dG8gaiA9IDA7IGogPCBuY29sczsgKytqKQogICAgICAgICAgICB0cmFuc3Bvc2VkW2pdW2tdID0gbWF0cml4W2tdW2pdOwoKICAgIHJldHVybiB0cmFuc3Bvc2VkOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kdm9pZCBwcmludChUIGNvbnN0ICYgdCkKewoJZm9yKGF1dG8gY29uc3QgJiByb3cgOiB0KQoJewoJCWZvcihhdXRvIGNvbnN0ICYgY29sIDogcm93KQoJCQlzdGQ6OmNvdXQgPDwgY29sIDw8ICcgJzsKCQlzdGQ6OmNvdXQgPDwgJ1xuJzsKCX0KCXN0ZDo6Y291dCA8PCAnXG4nOwp9CgppbnQgbWFpbigpCnsKCXN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGludD4+IEEoNywgc3RkOjp2ZWN0b3I8aW50Pig5KSk7CglpbnQgdmFsID0gMTE7Cglmb3IoYXV0byAmIHJvdyA6IEEpCgkJZm9yKGF1dG8gJiBjb2wgOiByb3cpCgkJCWNvbCA9IHZhbCsrOwoJcHJpbnQoQSk7CglwcmludCh0cmFuc3Bvc2UoQSkpOwoJCglyZXR1cm4gMDsKfQ==