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

时间:2015-12-07 15:46:49

标签: 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;
    }
};

问题出在这一行:

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

我收到输入的运行时错误:[]。 但是,我想出了解决方案,这很简单,但很难解释。这是修复,我只是在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;
    }
};

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

1 个答案:

答案 0 :(得分:11)

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

您要么在减去一个之前将其转换为有符号的零(正如您的工作代码所做的那样),或者想一想空的应该如何表现。如:

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

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