Хорошо, все эти префиксы / постфиксы "оптимизация" просто ... какое-то большое недоразумение.
Основная идея, что i ++ возвращает свою оригинальную копию и, следовательно, требует копирования значения.
Это может быть правильным для некоторых неэффективных реализаций итераторов. Однако в 99% случаев даже с итераторами STL нет никакой разницы, потому что компилятор знает, как его оптимизировать, а фактические итераторы - это просто указатели, которые выглядят как класс. И, конечно, нет разницы для примитивных типов, таких как целые числа в указателях.
Так что ... забудь об этом.
РЕДАКТИРОВАТЬ: Очистка
Как я уже говорил, большинство классов итераторов STL - это просто указатели , обернутые классами, которые имеют все функции-члены встроенные , позволяющие оптимизировать такие неактуальная копия.
И да, если у вас есть собственные итераторы без встроенных функций-членов, тогда это может
работать медленнее. Но вы просто должны понять, что делает компилятор, а что нет.
В качестве небольшого доказательства, возьмите этот код:
int sum1(vector<int> const &v)
{
int n;
for(auto x=v.begin();x!=v.end();x++)
n+=*x;
return n;
}
int sum2(vector<int> const &v)
{
int n;
for(auto x=v.begin();x!=v.end();++x)
n+=*x;
return n;
}
int sum3(set<int> const &v)
{
int n;
for(auto x=v.begin();x!=v.end();x++)
n+=*x;
return n;
}
int sum4(set<int> const &v)
{
int n;
for(auto x=v.begin();x!=v.end();++x)
n+=*x;
return n;
}
Скомпилируйте его в сборку и сравните sum1 и sum2, sum3 и sum4 ...
Я просто могу вам сказать ... GCC дает точно такой же код с -02
.