Прежде всего, вы не создаете массив, когда пишете int building = {1,2,3,4 };
Это должно быть int building[] = {1,2,3,4 };
Ошибка компиляции из-за того, что ваш вектор удерживает объект объекта, но вы пытаетесь присвоить ему указатель. В вашем первом методе вы можете оставить векторное хранилище unit *
Ваш второй способ в порядке, но третий - неправильный, деструкторы не называются таким образом, и вам не следует вручную вызывать деструктор, компилятор сделает это за вас, когда выйдет из области видимости цикла for.
По моему мнению, Best действительно зависит от того, каким образом вы хотите использовать свой вектор, самый быстрый и безопасный метод будет вторым методом, он использует распределение стека, и это очень быстро и безопасно. (нет необходимости вручную удалять). Он также дружествен к кешу, поскольку в памяти все последовательно, проход по всем блокам происходит быстро.
Почему программисты на C ++ должны минимизировать использование новых
В VIM вы можете создать макрос, который будет выполнять любые правки, которые вы обычно делаете в обычном режиме
, не нарушая функциональность redo [.]
оборачивая эти правки в пользовательскую : функцию
, а затем выполняя эту функцию с помощью клавиши педали : map
.
Лучший способ увидеть это на примере. Предположим, вы хотите добавлять текст гггг
в конец текущей строки каждый раз, когда вы нажимаете клавишу F2, но не хотите, чтобы это мешало команде повторения [.]
.
Вот как это сделать:
Откройте новое окно vim и выполните следующие команды:
: fu JL ()
нормальный айыы
endfu
: map : вызвать JL ()
Теперь добавьте текст, скажем, xxx
, набрав Axxx
Теперь нажмите клавишу [F2]
, и вы должны увидеть xxxyyy
Наконец, нажмите клавишу [.]
, и вы увидите xxxyyyxxx
Как раз то, что вы хотели!
Это работает из-за природы способ, которым VIM выполняет команду повтора. VIM отслеживает символы команды по мере ее ввода. Когда вы нажимаете клавишу [.]
, он вставляет эти символы обратно в буфер клавиатуры для их повторного выполнения. К сожалению, простой макрос q
работает так же - он вставляет символы в буфер и перезаписывает буфер повторного выполнения. Команда : normal
также делает это, но при помещении внутрь пользовательской функции мы обходим это ограничение, поскольку код, выполняющий пользовательскую функцию, сохраняет и восстанавливает буфер повторения во время пользовательской функции.
Все это происходит в eval.c
и getchar.c
в исходном коде VIM. Найдите saveRedobuff
, чтобы увидеть, что происходит.
Единственным путем я могу думать для выручения Вас: повторно отобразитесь '.' для сохранения истории действий, которые Вы могли затем вспомнить в случае необходимости. Для идей об этих строках посмотрите repeat.vim плагин.
Можно записать действие в регистр, который будет использоваться позже. Нажмите q, сопровождаемый регистром (a-z, A-Z, 0-9 или "являются допустимыми идентификаторами регистра), примените желаемую команду/действия и нажатие q для остановки записи. Команда может быть повторно вызвана путем нажатия сопровождаемый регистром.
Для более подробных инструкций посмотрите сложный повторный раздел документации Vim.
Примечание: К сожалению, последовательность qa.qu не сделает точно, что Вы хотите начиная с. команда повторит текущее последнее действие а не последнее действие в то время, когда команда была зарегистрирована.