﻿# V803\. Decreased performance\. It is more effective to use the prefix form of \+\+it\. Replace iterator\+\+ with \+\+iterator\.

Анализатор обнаружил конструкцию, которую потенциально можно оптимизировать\. В коде программы итератор изменяется посредством постфиксного оператора инкремента/декремента\. Так как предыдущее значение итератора не используется, то постфиксный итератор можно заменить префиксным\. В ряде случаев префиксный итератор будет работать быстрее постфиксного, особенно в Debug\-версиях программы\.

Пример:

```cpp
std::vector<size_t>::const_iterator it;
for (it = a.begin(); it != a.end(); it++)
{ ... }
```

Более быстрый вариант:

```cpp
std::vector<size_t>::const_iterator it;
for (it = a.begin(); it != a.end(); ++it)
{ ... }
```

Префиксный оператор инкремента изменяет состояние объекта и возвращает себя в уже изменённом виде\. Оператор префиксного инкремента в классе итератора для работы с std::vector может выглядеть так:

```cpp
_Myt& operator++()
{ // preincrement
  ++_Myptr;
  return (*this);
}
```

В случае постфиксного инкремента ситуация сложнее\. Состояние объекта должно измениться, но при этом возвращено предыдущее состояние\.  Возникает дополнительный временный объект:

```cpp
_Myt operator++(int)
{ // postincrement
  _Myt _Tmp = *this;
  ++*this;
  return (_Tmp);
}
```

Если мы хотим только увеличить значение итератора, то получается, что префиксная форма предпочтительна\. Поэтому, один из советов по микро\-оптимизации программ писать "for \(it \= a\.begin\(\); it \!\= a\.end\(\); \+\+it\)" вместо "for \(it \= a\.begin\(\); it \!\= a\.end\(\); it\+\+\)"\. В последнем случае происходит создание ненужного временного объекта, что снижает производительность\.

Более подробно все это можно почитать в книге Скотта Мейерса "Наиболее эффективное использование С\+\+\. 35 новых рекомендаций по улучшению ваших программ и проектов" \(Правило 6\. Различайте префиксную форму операторов инкремента и декремента\) \[1\]\.

Также в заметке "Есть ли практический смысл использовать для итераторов префиксный оператор инкремента \+\+it, вместо постфиксного it\+\+?" \[[2](https://pvs-studio.ru/ru/blog/posts/cpp/0093/)\] можно познакомиться с примерами замера скорости\.

## Библиографический список

1. Мейерс С\. Наиболее эффективное использование С\+\+\. 35 новых рекомендаций по улучшению ваших программ и проектов: Пер\. с англ\. \- М\.: ДМК Пресс, 2000\. \- 304 с\.: ил\. \(Серия "Для программистов"\)\. ISBN 5\-94074\-033\-2\. ББК 32\.973\.26\-018\.1\.
1. Андрей Карпов\. [Есть ли практический смысл использовать для итераторов префиксный оператор инкремента \+\+it, вместо постфиксного it\+\+?](https://pvs-studio.ru/ru/blog/posts/cpp/0093/)