Я работаю с большим количеством вычислительного кода, написанного на C ++, имея в виду высокую производительность и небольшие накладные расходы на память. Он часто использует контейнеры STL (в основном vector
) и перебирает эти контейнеры почти в каждой отдельной функции.
Повторяющийся код выглядит так:
for (int i = 0; i < things.size(); ++i)
{
// ...
}
но выдает предупреждение о несоответствии со знаком / без знака (C4018 в Visual Studio).
Замена int
на какой-либо unsigned
тип - проблема, потому что мы часто используем прагмы OpenMP, и для этого требуется счетчик int
.
Я собираюсь подавить (сотни) предупреждений, но боюсь, что упустил изящное решение проблемы.
Об итераторах . Я считаю, что итераторы хороши, когда применяются в соответствующих местах. Код, с которым я работаю, никогда не изменит контейнеры с произвольным доступом list
или что-то в этом роде (поэтому итерация int i
уже не зависит от контейнера) и всегда будет нуждаться в текущем индексе. И весь дополнительный код, который вам нужно ввести (сам итератор и индекс), просто усложняет ситуацию и скрывает простоту основного кода.
int
.