2015-12-07 4 views
0

Недавно я столкнулся с запутанной ситуацией. Я не знаю объяснений. Вот мой простой код:Невозможно использовать vector.size() внутри оператора условия цикла в C++

class Solution { 
public: 
    bool canAttendMeetings(vector<Interval>& intervals) { 
     sort(intervals.begin(), intervals.end(), compare); 
     for (int i=0; i<intervals.size()-1; i++) { 
      if (intervals[i].end > intervals[i+1].start) return false; 
     } 
     return true; 
    } 
private: 
    static bool compare(const Interval &interval1, const Interval &interval2) { 
     return interval1.start < interval2.start; 
    } 
}; 

Проблема заключается в этой строке:

for (int i=0; i<intervals.size()-1; i++) { 

Я получил сообщение об ошибке во время выполнения для ввода: []. Тем не менее, я понял, исправить, и это довольно просто, но трудно объяснить. Вот исправление, я просто назначаю interval.size() новой переменной перед циклом for.

class Solution { 
public: 
    bool canAttendMeetings(vector<Interval>& intervals) { 
     sort(intervals.begin(), intervals.end(), compare); 
     int n = intervals.size(); 
     for (int i=0; i<n-1; i++) { 
      if (intervals[i].end > intervals[i+1].start) return false; 
     } 
     return true; 
    } 
private: 
    static bool compare(const Interval &interval1, const Interval &interval2) { 
     return interval1.start < interval2.start; 
    } 
}; 

Может кто-нибудь объяснить мне, почему первая версия не работает, но работает вторая версия? Большое спасибо!

+0

Каков точный текст ошибки времени выполнения для первого сценария? – eduffy

ответ

11

Проблема в том, что size() возвращает unsigned 0, когда контейнер пуст.

Вы либо хотите преобразовать это значение в нулевой знак перед тем, как вычесть его (как это сделал ваш рабочий код), или поразмыслить над тем, как должно быть пустым. Такие, как:

for (std:size_t i=1; i<intervals.size(); i++) { 
     if (intervals[i-1].end > intervals[i].start) return false; 

выше предполагает, что вы знали, что вычитая одно из беззнакового нуля даешь очень большое количество, а не отрицательное число (и вы просто не поняли, что ваш код был вычитая одно из беззнаковых нуль). Но в случае, если вы подумали, что вычесть один из беззнакового нуля, дал отрицательный результат, теперь вы знаете.

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