无法在C++中的for循环条件语句中使用vector.size()

ief*_*oix 0 c++ for-loop vector

我最近遇到了一个令人困惑的情况.我不知道解释.这是我的简单代码:

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;
    }
};
Run Code Online (Sandbox Code Playgroud)

问题出在这一行:

for (int i=0; i<intervals.size()-1; i++) {
Run Code Online (Sandbox Code Playgroud)

我得到输入的运行时错误:[].但是,我想出了修复,这很简单,但很难解释.这是修复,我只是在for循环之前将interval.size()分配给一个新变量.

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;
    }
};
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释为什么第一个版本不起作用但第二个版本有效吗?非常感谢!

JSF*_*JSF 11

问题是size()当容器为空时返回无符号0.

您要么在减去一个之前将其转换为有符号的零(正如您的工作代码所做的那样),要么更多地考虑空的行为.如:

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

上面假设您知道从无符号零中减去一个给出一个非常大的数字,而不是一个负数(并且您只是没有意识到您的代码从无符号零中减去一个).但是如果你认为从无符号零中减去一个给出一个负面结果,现在你知道了.