2014-01-31 2 views
0

В 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; 
} 
+0

Моя единственная мысль заключается в том, что я задаюсь вопросом, оставлен ли порядок приращений неуказанным в '* dest ++ = * begin ++', но вы дали заказ на добавочный шаг во втором примере. –

ответ

1

сообщение увеличивающимся итератор (или что-нибудь еще в этом отношении) может показаться запутанным, но то, что он делает, довольно прямолинейно. Он копирует значение, увеличивает исходное и возвращает копию. Таким образом, место, на которое ссылается «* dest ++», такое же, как «* dest», единственное отличие состоит в том, что после завершения инструкции dest теперь будет ссылаться на следующую итерацию в итерации.

Единственные проблемы с этим возникают, когда программисты повторно используют увеличиваемую переменную в одном выражении. (Который обычно используется только как мозговой тизер, и результирующий эффект варьируется от языка к языку)

Смежные вопросы