Поскольку вопрос начинается с фразой:
«Я хочу, чтобы избежать предупреждений о сравнении между неподписанными INT и подписанных междами»
Я предположил, что vec.size()
возвращает unsigned int
.
Если тип, возвращаемый vec.size()
, может быть сохранен в unsigned int
, то вы можете использовать следующее.
for (auto i = 0u; i < vec.size(); i++) {
// do something
}
В противном случае используйте соответствующий тип или проверьте другие ответы.
Если vec
имеет тип std::vector<T>
(который не был упомянут в вопросе, следовательно, выше коде) вы можете также использовать цикл for_each (который также не был упомянут)
std::for_each(vec.begin(), vec.end(), [](T t){ /* do something with t */ });
std::for_each(vec.begin(), vec.end(), [](T & t){ /* do something with t */});
std::for_each(vec.begin(), vec.end(), [](const T & t){ /* do something with t */ });
Это может быть более удобно, если у вас есть ходить по векторным элементам с некоторыми уже существующими функциональными-объектами (или методы или функцию, не являющиеся членами)
void f(int x) { std::cout << "f: " << x << "\n"; }
void g(int x) { std::cout << "g: " << x << "\n"; }
...
std::vector<int> vec{1, 2, 3};
std::for_each(vec.begin(), vec.end(), std::bind(f, std::placeholders::_1)); //calls f(int)
std::for_each(vec.begin(), vec.end(), std::bind(g, std::placeholders::_1)); //calls g(int)
более удобно, еще потому вы можете держать фантазии обратного вызова и установить его в соответствующую функцию в соответствии с потребностями
std::function<void(int)> callback = std::bind(f, std::placeholders::_1);
if (userWantsG())
callback = std::bind(g, std::placeholders::_1);
std::for_each(vec.begin(), vec.end(), callback); //calls g or f
Используйте конструкцию 'range for'. 'for (auto const & v: vec) {}'. –
'decltype' позволит вам автоматически выводить тип на основе значения. –
Существует 'for (decltype (vec.size()) i = 0; i