列表C++的不同行为

Different behavior of list C++

本文关键字:C++ 列表      更新时间:2023-10-16

我需要帮助。我不知道为什么我的程序在主函数和任何其他函数中的工作方式不同,比如说 solve(( 函数。我想 http://codeforces.com/contest/768/problem/B?locale=en 解决这个问题。我已经编写了代码,它工作正常,但在服务器中受到时间限制。我的代码是这样的,当我编译它时它工作正常:

#include<iostream>
#include<windows.h>
#include<math.h>
#include<algorithm>
#include<map>
#include<list>
#include<iterator>
using namespace std;
main()
{
    list < int > li;
    list < int >::iterator i;
    list < int >::iterator end = li.begin();
    int n, l, r, buffer, ans = 0;
    cin >> n >> l >> r;
    li.push_back(n);
    for(i=li.begin(); i!=li.end(); i++)
    {
        while(*i>1)
        {
            buffer = *i;
            i = li.erase(i);
            li.insert(i, buffer/2);
            li.insert(i, buffer%2);
            li.insert(i, buffer/2);
        }
    }
    advance(end, r+1);
    i = li.begin();
    for(advance(i, l-1); i!=end; i++)
        ans += *i; 
    cout << ans << endl;
    return 0;
}

当我像这样重写代码时,它会停止正常工作,所以我认为时间限制是因为这个:

#include<iostream>
#include<windows.h>
#include<math.h>
#include<algorithm>
#include<map>
#include<list>
#include<iterator>
using namespace std;
int solve()
{
    list < int > li;
    list < int >::iterator i;
    list < int >::iterator end = li.begin();
    int n, l, r, buffer, ans = 0;
    cin >> n >> l >> r;
    li.push_back(n);
    for(i=li.begin(); i!=li.end(); i++)
    {
        while(*i>1)
        {
            buffer = *i;
            i = li.erase(i);
            li.insert(i, buffer/2);
            li.insert(i, buffer%2);
            li.insert(i, buffer/2);
        }
    }
    advance(end, r+1);
    i = li.begin();
    for(advance(i, l-1); i!=end; i++)
        ans += *i; 
    cout << ans << endl;
}
main()
{
    ios_base::sync_with_stdio(false);
    solve();
    return 0;
}

有人知道为什么吗?

我已经找到了答案。

    while(*i>1)
    {
        buffer = *i;
        i = li.erase(i);
        li.insert(i, buffer/2);
        li.insert(i, buffer%2);
        li.insert(i, buffer/2);
    }

在代码的这一部分。当迭代器"i"到达末尾并擦除值时,它指向列表的(右侧(不存在的部分,因此程序的行为异常。

您的程序具有未定义的行为。

你有:

list < int >::iterator end = li.begin();

在将任何内容添加到列表中之前,这与

list < int >::iterator end = li.end();

其次

advance(end, r+1);

这是一个问题,因为您无法前进end.