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