В Accelerated C++
Andrew Koenig
он пишет следующий код для введения в шаблоны и общие функции. Этот код пропускает первый элемент в контейнере? Или он копирует первый объект-итератор до приращения:
template<class In, class Out>
Out copy(In begin, In end, Out dest)
{
while (begin != end)
*dest++ = *begin++;
return dest;
}
Другими словами, это ведет себя так же, как и его код?:
template<class In, class Out>
Out copy(In begin, In end, Out dest)
{
while (begin != end)
*dest = *begin;
dest++; begin++;
return dest;
}
Сообщение об увеличении итератора (или что-то еще в этом случае) может показаться запутанным, но то, что он делает, довольно прямолинейно. Он копирует значение, увеличивает исходное и возвращает копию. Таким образом, местоположение, на которое ссылается "* dest++", совпадает с "* dest", единственное отличие состоит в том, что после завершения инструкции dest теперь будет ссылаться на следующую итерацию в итерации.
Единственные проблемы с этим возникают, когда программисты многократно используют инкрементированную переменную в одном выражении. (Который обычно используется только как мозговой тизер, и результирующий эффект варьируется от языка к языку)
*dest++ = *begin++
не указан порядок приращения, но во втором примере вы указали порядок для постинкремента.