Вот как я бы это сделал, поскольку его проще использовать с обычными итераторами (так же, как std :: copy), потому что код, специфичный для типа итератора (произвольный доступ), находится вне цикла:
buffer_type* begin = buffer; // EDIT: buffer_type is whatever type buffer contains.
buffer_type* end = buffer + size + 1; // EDIT: usually this would be 'buffer + size'
buffer_type* out = new_buffer; // EDIT: don't want to lose the pointer to new_buffer!
while(buffer != end) {
*out = *begin
++begin; ++new_buffer;
}
Так что вам бы не пришлось менять цикл, если вы решили использовать итератор другого типа.
Некоторые утилиты проверки кода могут жаловаться на это, потому что думают, что вы собираетесь навлечь на себянарушение доступа, но это не так, поскольку последняя разыменование происходит перед последним приращением.
Выбор size
для имени переменной здесь довольно запутанный, кстати.Это означает, что buffer + size
будет один за концом buffer
, так как вы начинаете маркировать элементы массива с нуля, но вы начинаете считать их с одного, поэтому последний элемент обычно будет иметь индекс size - 1
.
Кроме того, если вы собираетесь использовать цикл for и оператор индексирования, вы должны использовать unsigned int
для индексации.Отрицательные индексы законны, но я не думаю, что вы намереваетесь разрешить их здесь.