Один из способов сделать это - создать один большой массив непрерывной (сортируемой) памяти и затем обращаться к этому массиву как массив подмассивов через секунду массив указателей.
Второй массив просто содержит список указателей, каждый из которых указывает на отдельный подмассив внутри большего.
Примерно так:
int M, N;
std::cin >> M >> N;
// one big array of actual data
// (an array of contiguous sub-arrays)
std::vector<int> v(M * N);
// array of pointers to sub-arrays within the actual data
std::vector<int*> pMat;
// point the pointers at the actual data
// each pointer pointing to the relevant sub-array
for(int i = 0; i < M; i++)
pMat.push_back(v.data() + (i * N));
// get the input, changing the actual data
// through the pointers
for(int i = 0; i < M; i++)
for(int j = 0; j < N; j++)
std::cin >> pMat[i][j];
// sort the actual data
std::sort(std::begin(v), std::end(v));
// look at the data through the sub-array pointers
for(int i = 0; i < M; i++)
{
for(int j = 0; j < N; j++)
std::cout << pMat[i][j] << " ";
std::cout << '\n';
}
return 0;
Примечание: Я использовал std::vector
для управления массивами, но он также будет работать со встроенными массивами, созданными с помощью new[]
и delete[]
(не рекомендуется).
РЕДАКТИРОВАТЬ: Для добавления.
В качестве альтернативы ( намного лучше ) вы можете создать класс, который будет хранить данные в большом непрерывном блоке иполучить доступ к различным подмассивам , используя математические смещения, например:
template<typename T>
class two_dee_array
{
public:
two_dee_array(std::size_t M, std::size_t N): v(M * N), stride(N) {}
T& operator()(std::size_t M, std::size_t N)
{ return v[(M * stride) + N]; }
T const& operator()(std::size_t M, std::size_t N) const
{ return v[(M * stride) + N]; }
std::size_t col_size() const { return stride; }
std::size_t row_size() const { return v.size() / stride; }
auto begin() { return std::begin(v); }
auto end() { return std::end(v); }
auto begin() const { return std::begin(v); }
auto end() const { return std::end(v); }
auto cbegin() const { return std::cbegin(v); }
auto cend() const { return std::cend(v); }
private:
std::vector<int> v;
std::size_t stride;
};
int main()
{
int M, N;
std::cin >> M >> N;
two_dee_array<int> v(M, N);
for(int i = 0; i < M; i++)
for(int j = 0; j < N; j++)
std::cin >> v(i, j);
std::sort(std::begin(v), std::end(v));
for(int i = 0; i < M; i++)
{
for(int j = 0; j < N; j++)
std::cout << v(i, j) << " ";
std::cout << '\n';
}
}