Ordinare una matrice per una colonna

Come faccio ad ordinare una matrice per una colonna?
Tipo ho una matrice:

matrice=

{4, 3}
{3, 2}
{1, 6}
{5, 16}

e la voglio ordinare per la prima colonna, cosicchè sarà così:

{1,6}
{3,2}
{4,3}
{5,16}

come faccio in c++?

Non mi è molto chiaro.
Immagino che ogni coppia di graffe rappresenti una riga, per cui le colonne della matrice sono {4, 3, 1, 5} e {3, 2, 6, 16}.
Ordinandole in modo lessicografico ottieni {3, 2, 6, 16}, {4, 3, 1, 5}.
E quindi la matrice ordinata dovrebbe essere:

{3, 4}
{2, 3}
{6, 1}
{16, 5}

Se vuoi ottenere questo effetto puoi usare un vettore con gli indici delle colonne e richiami la funzione di ordinamento con un comparatore personalizzato in cui definisci il modo in cui una colonna è minore rispetto ad un’altra.
Ora puoi modellare la matrice originaria in base agli indici ordinati delle colonne.

Credo che il metodo più veloce da scrivere sia rappresentare la matrice come vector di vector, invertire le righe le colonne, ordinare la matrice, invertire di nuovo righe e colonne.

Ti lascio direttamente il codice commentato che fa quello che dici. Se qualcosa non ti è chiaro chiedimi pure.

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>

using namespace std;

struct compare {
	vector<vector<int>> matrix;
	int col;
	
	// the constructor takes the matrix and the column that determines the order
	compare(vector<vector<int>> m, int c) {
		matrix = m;
		col = c;
	}
	
	/* compare operator takes the indices of two rows and returns whether
	 * the first one comes before the second
	 */
	bool operator() (const int &i, const int &j) {
		return matrix[i][col] < matrix[j][col];
	}
};

void sort_by_column(vector<vector<int>> &matrix, int col) {
	// sorts rows of matrix increasingly according to column col
	int n = (int)matrix.size();
	int m = (int)matrix[0].size();
	
	// object that acts as comparator function
	compare cmp(matrix, col);
	vector<int> rows(n);
	// initialize rows with the numbers 0, 1, ..., n - 1
	iota(rows.begin(), rows.end(), 0);
	// sort the (indices of the) rows
	sort(rows.begin(), rows.end(), cmp);
	
	// construct a new matrix with sorted rows
	vector<vector<int>> sorted_matrix(n);
	for (int i = 0; i < n; i++)
		sorted_matrix[i] = matrix[rows[i]];
	matrix = sorted_matrix;
}

int main() {
	int n = 4, m = 2;
	vector<vector<int>> matrix = {{4, 3}, {3, 2}, {1, 6}, {5, 16}};
	int col = 0;
	
	sort_by_column(matrix, col);
	
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++)
			cout << matrix[i][j] << " ";
		cout << "\n";
	}
	
	return 0;
}
vector<vector<int> > mat;
sort(mat.begin(),mat.end(),[](vector<int>& u, vector<int>& v){return u[0]<v[0];});