std::vector<T>::size()
возвращает std::vector<T>::size_type
, который является целым числом без знака.
Следовательно по сравнению с i
в выражении i < myvec->size()
, который имеет тип int
(то есть целое число со знаком), вы по праву получить предупреждение, потому что вы сравниваете беззнаковое целое с подписанным один.
Причина, по которой вы получаете это предупреждение, состоит в том, что при экстремальных значениях (то есть их максимальных и минимальных значениях) целые числа без знака могут стать больше, чем их подписанные копии. Компилятор выдает предупреждение, чтобы «спросить»/«предупредить» вас, если вы учтете все проблемы, которые могут возникнуть из-за этого.
Если это не проблема для вас, вы можете изменить это предупреждение, просто нажав.
for(int i(0); i < static_cast<int>(myvec->size()); ++i) {
...
}
Другим способом было бы изменить тип i
совпадающее myvec->size()
:
for(std::vector<float>::size_type i(0); i < myvec->size(); ++i) {
...
}
Ум, однако, что i
становится беззнаковое целое число типа, и если вы его уменьшения в цикле вы может получить неожиданные результаты (т. е. он не получит отрицательных значений).
Другой путь, и если ваш компилятор поддерживает C++ 11 и, если вы хотите, чтобы петля над элементами вашего вектора без изменения самого вектора, будет использовать цикл на основе диапазона, как:
for(auto &&e : *myvec) {
...
}
Мои личный фаворит для цикла по элементам вектора:
for(int i(0), sz(myvec->size()); i <sz; ++i) {
...
}
Возможные дубликат [Что случилось с моим Для петель? Я получаю предупреждения: сравнение выражений с подписью и без знака \ [-Wsign-compare \]] (http://stackoverflow.com/questions/7984955/what-is-wrong-with-my-for-loops-i-get -warnings-compare-between-signed-and-u) –
Возможный дубликат [Как я могу исправить предупреждения типа: «сравнение между подписанным и неподписанным»?] (http://stackoverflow.com/questions/859943/how-can -i-fix-warnings-like-comparison-between-signed-and-unsigned) –