2017-01-04 6 views
0

Следующий код не выполняет if часть ... при первом вызове level является 0 и view.size() - 1 является -1, но вариант else выбран вместо ..Сравнение странное поведение

vector<int> rightSideView(TreeNode* root) { 
     vector<int> solution; 
     createView(root, solution, 0); 
     return solution; 

    } 
    void createView(TreeNode* root, vector<int>& view, int level) { 
     if(root == NULL) 
      return; 
     if(level > view.size() - 1) { 
      view.push_back(root->val); 
     } 
     else { 
      // only this part is executed 
      view[level] = root->val; 
     } 
     createView(root->left, view, level + 1); 
     createView(root->right, view, level + 1); 

    } 

Корень не NULL .. действительно, если я поставлю сообщение в скобке else, и у меня есть n узлов, он будет печатать n раз. В чем причина этого странного поведения?

+1

Вы должны получили предупреждение о подписал против знака сравнения ... * "view.size() - 1 -1" *, нет, это было бы быть очень большим числом. – Jarod42

+0

@ Jarod42 Я использую онлайн-платформу, поэтому я ничего не знал о таких предупреждениях. – gigiman

+0

Используйте 'static_cast (view.size()) - 1'. – Jarod42

ответ

3

view.size() - 1 будет наибольшее число для std::size_t когда view.size() является 0, как это unsigned.

Использование

if (level > static_cast<int>(view.size()) - 1) { 

или

if (level + 1 > view.size()) { 
+0

, когда я 'printf ("% d ", view.size() - 1);' Он печатает '-1'. – gigiman

+0

Вы показываете результат на' подписанный int'. – Jarod42

+0

@gigiman «% d» сообщает 'printf' отформатировать целое число со знаком. Вы передали ему целое число без знака, которое 'printf' будет неверно истолковываться, потому что оно не знает ничего лучшего. Один из недостатков 'printf' заключается в том, что он полагается на программиста, чтобы не лгать ему (случайно или иначе) о типах входов. Предпочитает 'std :: cout', который будет печатать правильно или отказаться от компиляции. – user4581301