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

Unable to use vector.size() inside the for loop condition statement in C++

本文关键字:vector size 语句 条件 C++ 中的 循环 for      更新时间:2023-10-16

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

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循环之前将intervals.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;
    }
};

有人能向我解释为什么第一个版本不起作用,而第二个版本起作用吗?非常感谢!

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

您要么想在减去一之前将其转换为有符号的零(就像您的工作代码所做的那样),要么更多地考虑空应该如何表现。例如:

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

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