2016-08-22 3 views
3

Когда я компилирую моя программа C++ с использованием г ++предупреждение: сравнение между подписанных и неподписанных целочисленных выражений [-Wsign-сравнить]

warning: comparison between signed and unsigned integer expressions [-Wsign-compare] 
     for (int i=0; i< myvec->size(); i++){ 
            ^

где myvec является объектом std::vector<float>.

Для итерации по элементам в std :: vector, мне нужно иметь дело с предупреждением? Благодарю.

+3

Возможные дубликат [Что случилось с моим Для петель? Я получаю предупреждения: сравнение выражений с подписью и без знака \ [-Wsign-compare \]] (http://stackoverflow.com/questions/7984955/what-is-wrong-with-my-for-loops-i-get -warnings-compare-between-signed-and-u) –

+0

Возможный дубликат [Как я могу исправить предупреждения типа: «сравнение между подписанным и неподписанным»?] (http://stackoverflow.com/questions/859943/how-can -i-fix-warnings-like-comparison-between-signed-and-unsigned) –

ответ

2

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) { 
    ... 
} 
+0

спасибо. может ли мой код вызвать некоторую потенциальную проблему? – Tim

+0

@ Направьте правильный способ сделать это с помощью 'iterators' или' size_type' – KostasRim

+0

Вы должны быть осторожны с 'int', если контейнеры очень большие,' int' может переполняться. – Galik

2

vector в C++ использует size_type индексировать элементы. Вы можете написать цикл с этим:

for(std::vector<float>::size_type i = 0; i < myvec->size(); i++) { 
//code here 
} 

Другой подход заключается в использовании итераторов:

for(auto it = myvec->begin(); it != myvec->end(); ++it) { 
//code here 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^