Прежде всего, ваша функция GetMap
постоянно отталкивает новые элементы.Это большая нет, нет, если у вас уже есть размер матрицы, доступной для вас (M
и N
).Кроме того, на самом деле нет необходимости, чтобы параметры размера имели тип int&
.Простое int прекрасно и в большинстве случаев даже более эффективно.
Правило большого пальца: используйте ссылки только для неосновных типов, таких как vector
, string
и почти для всех классов.
Кроме того, тот факт, что вы используете int&
, а не const int&
, не позволяет вам вызывать функцию, передавая значения rvalue (переменные без имен).Например GetMap(5, 5)
.
Теперь, чтобы окончательно ответить на ваш вопрос.Поскольку у вас уже есть идея о том, как проанализировать всю матрицу в вашей функции GetMap
.Я действительно не вижу проблемы в создании аналогичной функции, которая бы получала позицию нужного символа.
Полный рабочий код с некоторыми улучшениями:
#include <iostream>
#include <vector>
using namespace std;
struct Pos{
Pos() : x(0), y(0) {}
Pos(int x, int y) : x(x), y(y) {}
int x;
int y;
};
vector<vector<char>> GetMap(const int height, const int width) //function to get the map of a room
{
//Create the matrix with the constructor (much more efficent than constantly push_back'ing elements)
vector<vector<char>> matrix(height, vector<char>(width));
//Go through every single char in the matrix
for (int rows = 0; rows < height; rows++)
{
for (int cols = 0; cols < width; cols++)
{
cin >> matrix[rows][cols];
}
}
return matrix;
}
Pos getElementPos(const vector<vector<char>>& matrix, const char toFind)
{
int height = matrix.size();
int width = matrix[0].size();
//Go through every single char in the matrix
for (int rows = 0; rows < height; rows++)
{
for (int cols = 0; cols < width; cols++)
{
if(matrix[rows][cols] == toFind){
return Pos(cols, rows);
}
}
}
// In the event that we couldn't find the element
return Pos(-1, -1);
}
int main(){
vector<vector<char>> map = GetMap(5, 5);
Pos dPos = getElementPos(map, 'D');
cout << "\nThe coordinates of D are " << dPos.x << " and " << dPos.y << '\n';
return 0;
}