for (int i = 0; getline(in, line); i++) {
vector<int> row; //создаем одномерный вектор
for (int j = 0; j < line.size(); j++) {
row.push_back(line[j]); //набиваем значениями
}
matrix.push_back(row); запихиваем полученный одномерный вектор в двумерный.
};
Дублирования легко избежать, реализовав всё по 1 разу, а в остальных методах просто вызывать уже реализованные