Поэтому я инициализирую вектор в основной функции и передаю этот вектор в качестве ссылки в функцию, где изменяется его размер. Теперь я могу представить, что инициализированный вектор в основном изменит размер, но это не так. Я просто реализую это неправильно?
#include <iostream>
#include <vector>
using std::vector;
void createImage(vector<vector<char> >& img){
int cols, rows;
std::cin >> rows >> cols;
img.clear();
for(int i = 0; i < rows; i++)
img.push_back(vector<char>(cols, 'O'));
}
void colorPixel(vector<vector<char> > &img){
int xCoord, yCoord;
char color;
std::cin >> xCoord >> yCoord >> color;
img[xCoord][yCoord] = color;
}
void printVector(vector<vector<char> > &img){
for(int i = 0; i < img.size(); i++){
for(int j = 0; j < img[i].size(); j++)
std::cout << img[i][j];
std::cout << '\n';
}
}
int main(){
char operation;
while(std::cin >> operation){
vector<vector<char> > myVector;
if (operation == 'X')
break;
if (operation == 'I')
createImage(myVector);
if (operation == 'C')
printVector(myVector);
if (operation == 'L')
colorPixel(myVector);
}
}
Редактировать: Это то, что эффективно происходит. Когда вы создаете вектор, так что I 5 5 вызывает createImage(), это работает, но он начинает давать сбой, когда вы L 4 4 P вызывает colorPixel() в myVector[4][4].
Если бы я инициализировал myVector в main равным 250 250, тогда print напечатает все 250 строк, даже после изменения размера (например, 4 4) в createImage().
Короче говоря, я верю и точно знаю, что вектор внутри main не получает намека на то, что его размер изменился, есть ли какое-либо решение для этого?
Какой ввод приводит к сбою?
Каждая итерация вашего цикла создает новый вектор... Переместите объявление за пределами в цикл.
Когда вы создаете вектор, так что I 5 5 вызывает createImage(), это работает, но он начинает давать сбой, когда вы L 4 4 P вызывает colorPixel() в myVector[4][4].
В вашем коде нет проверки диапазона colorPixel
. printVector
предполагает, что вектор-вектора является квадратным, но это не обязательно так, поскольку входными данными являются количество строк и столбцов. (Эти входы также не защищены от неправильных значений, таких как 0 или отрицательные значения.)
@ChrisMM Спасибо за оригинальный ответ, это сработало.
@VetoFTW, когда вы получаете решение вопроса, пожалуйста, не редактируйте свой вопрос, чтобы пометить его как исправленный/решенный или опубликовать спасибо. Вместо этого вы должны либо проголосовать/принять опубликованный ответ, либо напишите свой ответ.
@RemyLebeau Хорошо, извини. Не буду делать это снова в следующий раз
while(std::cin >> operation){
vector<vector<char> > myVector;
Самое первое, что происходит в этом цикле while
, — это создание нового myVector
. Это буквально то, что это говорит в C++.
Когда достигается конец цикла, этот myVector
уничтожается. Вот как работает C++: если вы объявляете объект в цикле или внутри оператора if
, объект уничтожается, когда выполнение достигает конца этой области.
Итак, когда этот while
цикл достигает этого конца, этот myVector
уничтожается. Его больше нет. Этого не будет. Легче будет существовать. Будет тосковать по фьордам. Он станет бывшим myVector.
Затем снова проверяется условие цикла while
, и если условие по-прежнему выполняется, выполнение снова входит в while
, создавая новый myVector
с нуля. Это не будет иметь ничего общего с предыдущим myVector, который является лишь слабым воспоминанием.
И способ исправить это — объявить этот myVector
до этого цикла в начале вашего main
, чтобы этот myVector
уничтожался только тогда, когда main
завершает выполнение.
Почти буквально повторяя классику здесь.
Как узнать, что размер не изменился в
main
? У вас там нет чеков.