Привет, друзья, добро пожаловать в мою серию статей об изучении 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.