Pensandolo un poco no es claro si quieres crear una matriz en base a otra consistiendo de:
A) Todas las columnas menos las ultimas cuatro.
B) Solo las ultimas cuatro columnas.
Otro problema es que usualmente se almacena la informacion en filas y columnas (no al reves: columnas y filas).
En el caso usual con filas primero y columnas despues, utilizando la clase vector de C++ puedes:
1) Crear el nuevo vector
2) Utilizas por cada uno de los elementos del vector la funcion miembro "assign" para el reajuste del tamaño y copia de valores.
Un programa de ejemplo relativamente largo, la mayoria solo es "fluf" (creacion y asignacion de valores a la matriz), la parte importante donde se muestra el proceso de copia esta comentado.
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
#include <vector>
using std::vector;
int main()
{
vector<vector<int> > mat(10);
typedef vector<vector<int> >::size_type vvi_size;
typedef vector<int>::size_type vi_size;
for (vvi_size i = 0; i != mat.size(); ++i){
mat[i].resize(10);
for (vi_size j = 0; j != mat[i].size(); ++j)
mat[i][j] = j;
}
for (vvi_size i = 0; i != mat.size(); ++i){
for (vi_size j = 0; j != mat[i].size(); ++j)
cout << ' ' << mat[i][j];
cout << endl;
}
cout << "----" << endl;
// Creamos el nuevo vector
vector<vector<int> > nuevo(10);
// Iteramos por cada elemento (fila)
for (vvi_size i = 0; i != nuevo.size(); ++i)
// Asignamos los elementos requeridos del vector original (mat)
nuevo[i].assign(mat[i].begin(), mat[i].end() - 4);
// Impresion de prueba
for (vvi_size i = 0; i != nuevo.size(); ++i){
for (vi_size j = 0; j != nuevo[i].size(); ++j)
cout << ' ' << nuevo[i][j];
cout << endl;
}
return 0;
}
Un saludo