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