[在c ++中使用向量的问题解决方案在提交时显示𝒓𝒖𝒏𝒕𝒊𝒎𝒆,但是在使用自定义输入运行相同的输入时运行良好

问题描述 投票:0回答:1

最近我正在interviewbit.com-https://www.interviewbit.com/problems/merge-intervals/上解决此问题。

我使用向量并在向量上执行操作解决了问题

这是我的代码:

    vector<Interval> Solution::insert(vector<Interval> &intervals, Interval newInterval)
    {

    int n=intervals.size(),leftfound=0,rightfound=0,count=0;
    if(n==0)                  //for the case when intervals vector is empty
       {  
        intervals.push_back(newInterval);
        return intervals;   
       }

    int t=0;
    if(newInterval.end<newInterval.start)   //if(start>end) swap
       { 
        t=newInterval.start;
        newInterval.start=newInterval.end;
        newInterval.end=t;
       }
    if(newInterval.start>intervals[n-1].end) //if the newInterval succedes every other
       {
        intervals.insert(intervals.end(),newInterval);
        return intervals;
       }
    if(newInterval.end<intervals[0].start)//if the newInterval precedes every other element
       {
        intervals.insert(intervals.begin(),newInterval);
        return intervals;
       }

    auto left=intervals.begin(),right=intervals.begin(); //just initialising with something
    auto it=intervals.begin() ; // iterator for loops

    while((*it).start<newInterval.start&&it!=intervals.end()) //*it is dereferencing the iterator to 
        it++;         //get the element of vector "intervals" at that index

    it--; // decrementing it to reach the desired interval

    if((*it).start<=newInterval.start&&(*it).end>=newInterval.start)
       {
        leftfound=1;left=it;
       }
    else 
        left=it+1;

    it=left;

    while((*it).end<newInterval.end&&it!=intervals.end())
        it++;

    if((*it).start<=newInterval.end&&(*it).end>=newInterval.end)
       { 
        rightfound=1; right=it;
       }
    else 
        right=it-1;


    if(right-left==-1&&leftfound==0&&rightfound==0)// this if will be true in cases like:
        intervals.insert(left,newInterval);          //intervals=[(1,2),(8,10)] and newInterval=(4,6)
    else        //in every other case this else will execute
       {   
        if(leftfound==0)
        (*left).start=newInterval.start;
        if(rightfound==0)
        (*left).end=newInterval.end;
        else (*left).end=(*right).end;
       }
    left=left+1;

    intervals.erase(left,right+1);
    return intervals;
}

theviewbit.com平台(IDE)仅需要完成问题中提到的功能。

注意:您只需要实现给定的功能。不要读取输入,而是使用函数的参数。不打印输出,而是返回指定的值。还有疑问吗?检出示例代码以了解更多详细信息。

我需要实现这一点:

vector<Interval> Solution::insert(vector<Interval> &intervals, Interval newInterval) { }

也将间隔结构定义为:

struct Interval {
    int start;
    int end;
    Interval() : start(0), end(0) {}
    Interval(int s, int e) : start(s), end(e) {}
};

现在,当使用站点上的测试按钮进行测试时,此解决方案运行良好。之后,当我按提交时,它将显示以下错误:click to see error。当我使用自定义输入运行相同的测试用例(遇到错误)时,代码运行良好并给出了预期的输出。我似乎找不到问题所在。我怀疑这可能是由于擦除功能所致,因为在错误中它显示free(),但我什至无法肯定。

而且,我在ideone.com上运行了代码,并在代码中添加了结构和主函数,它运行得非常好。

c++ vector error-handling runtime-error out-of-memory
1个回答
1
投票
intervals.insert(left,newInterval); 

std::vector::insert使向量的所有现有迭代器无效。之后立即:

left=left+1;

intervals.erase(left,right+1);

到同一向量的leftright迭代器在这一点上不再有效,并且使用它们是未定义的行为。

这可能是也可能不是所示代码中的唯一错误。缩进的缩进使得所显示的代码难以阅读和遵循;但这是显示的代码中的确定错误,这很可能是未定义行为和崩溃的原因。

© www.soinside.com 2019 - 2024. All rights reserved.