Привет, друзья, добро пожаловать в мою серию статей об изучении C ++. Не отставая от других моих предыдущих сообщений, я выбираю еще один вопрос Leetcode, чтобы попытаться написать код на C ++. Задачи, которые я выбираю, не являются сложными, в основном это просто упражнение для меня по написанию C ++ и размышлению над тем, что я сочиняю на Medium.
Сегодня вопрос - переворачивать и переворачивать картинку.
Этот вопрос лично навевает некоторые воспоминания. Мой первый урок CS в колледже был посвящен манипулированию картинками (либо изменение размера в зависимости от какого-либо фактора, либо изменение цветов на черно-белые и т. Д.). Тогда я много узнал о цикле for и 2D-массиве. Теперь я узнаю то же самое о C ++.
Мой код ниже:
#include <iostream> class Solution { public: vector<vector<int>> flipAndInvertImage(vector<vector<int>>& A) { vector<vector<int>> returnImage; for (auto row = A.begin(); row != A.end(); ++row) { vector<int> newRow; for (auto ele = row->rbegin(); ele != row->rend(); ++ele) { int currEle = *ele; cout << "Current ele: " << *ele << "\n"; newRow.push_back(currEle ^ 1); } returnImage.push_back(newRow); } return returnImage; } };
Хотя я определенно мог написать это как можно ближе к Java, я решил не делать этого. В конце концов, я сейчас не изучаю Java.
Некоторые заметки, которые я заметил, когда проходил эту программу:
- Как и в Java, я мог объявить Vector (C ++) / ArrayList (Java) без указания размера. Следовательно, первая строка
vector<vector<int>> returnImage;
Это полезно, поскольку при работе с Array всегда есть ограничения на знание размера перед работой со структурой данных. Когда вы приближаетесь к максимальному размеру ArrayList (), в Java есть некоторые компромиссы (которые в основном не видны разработчикам), но также амортизируются - о, черт возьми, я думаю, мне нужно перечитать свои записи из колледжа по этому ). - В C ++ есть отличные итераторы, которых нет в Java:
.begin()
,.end()
,.rbegin()
и.rend()
. Это интересно, поскольку мне не нужно отслеживать счетчик, чтобы убедиться, что я не выхожу за пределы индекса и т. Д. Кроме того, неплохо иметь итератор, который просто идет с любого конца вектора. Он возвращает итератор, и я понял, что нам нужно разыменовать его перед использованием. Вот почему->
играет рольrow->rbegin()
. Мне даже не понадобилось использовать промежуточную переменную. - Итератору в C ++, похоже, не хватает
iterate()
метода в Java, и вместо этого он выбирает++
. curEle ^ 1
потому что1 ^ 1 = 0
и1 ^ 0 = 1
.- Для вектора
.push_back(element)
это то, что.add(element)
в ArrayList для Java. круто ..
В конце код очень похож на Java.