я не хочу использовать std :: copy ... его это правильная альтернатива цикла? - PullRequest
0 голосов
/ 23 сентября 2011

я пытаюсь не использовать STL.у меня есть эта строка в моем коде:

std::copy(buffer_, buffer_ + size_ + 1, new_buffer)

, если я не хочу использовать копию, это правильный эквивалент?

for (int i = 0; i < (size_ + 1); i++){
    new_buffer[i] = buffer[i];
}

или это совершенно неправильно?или это по одному?или что-то еще?

спасибо!

Ответы [ 3 ]

5 голосов
/ 23 сентября 2011

Хорошо, два примера кода, которые у вас есть, дадут один и тот же результат.

Однако при использовании size_ + 1 у вас будет ошибочная ошибкаПросто size_ является правильным значением, так как оно уже указывает на один элемент после последнего элемента.

0 голосов
/ 23 сентября 2011

Вот как я бы это сделал, поскольку его проще использовать с обычными итераторами (так же, как 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 для индексации.Отрицательные индексы законны, но я не думаю, что вы намереваетесь разрешить их здесь.

0 голосов
/ 23 сентября 2011

Не ясно, работает ли то, что вы написали. Версия copy работает, если buffer_ равен любой произвольный доступ и new_buffer равен любой выходной итератор. Ваша ручная версия работает, только если buffer_ является указателем.

Кроме этого, ваша ручная версия функционально эквивалентна. Если типы POD, вы, вероятно, могли бы добиться большего успеха с memcpy (при условии проверки на совпадения).

Обратите внимание, что ваш буфер, как вы его написали, имеет размер size_ + 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...