【问题标题】:c++ list isn't workingc ++列表不起作用
【发布时间】:2017-11-27 14:54:35
【问题描述】:

我认为问题是因为 jt 迭代器,当我从列表中删除一个元素时,我不知道确切原因,但我很确定 v.end() 正在改变并且我的迭代器正在跳过它。顺便说一句,我正在按降序对列表进行排序。

#include <fstream>
#include <list>

using namespace std;

ifstream fin("barci.in");
ofstream fout("barci.out");

int n,x,i,g,dif,ng,nd,k;

list <int> v;
list <int>::iterator it,jt;

bool cmp(int a, int b)
{
    return a>b;
}

int main()
{
    fin>>n>>g>>dif;

    for(i=0; i<n; i++)
    {
        fin>>x;
        v.push_back(x);
    }

    v.sort(cmp);

    /*for(it=v.begin(); it!=v.end(); it++)
        fout<<*it<<" ";*/

    for(it=v.begin(); it!=v.end(); )
    {
        ng=g-*it;
        nd=*it-dif;

        for(jt=++it; jt!=v.end(); jt++)
            if(*jt<=ng && *jt>=nd)
            {
                jt=v.erase(jt);
                break;
            }

        k++;
    }

    fout<<k;

    return 0;
}

【问题讨论】:

  • 为什么不使用remove_if。并且可以避免手动擦除的问题?
  • 考虑提供minimal reproducible example。您的示例需要特定文件,我们无法猜测它们包含什么。如果我们可以自己尝试您的代码,它将更容易识别问题。使用重要的名称也有助于理解和推理您的代码。
  • barci.in 8 100 10 81 37 32 88 55 93 45 72

标签: c++ list iterator infinite


【解决方案1】:

如果您在jt == it(循环中的第一轮)时删除了一个元素,it 将失效且无法递增。

然后jt=++it 在下一次迭代中做了坏事。

【讨论】:

  • 我该如何解决?
  • 我真的不知道。 erase 之后的 break 让每个人都感到困惑。我以前没见过。这似乎从较早的点重新开始扫描。这真的需要吗?否则标准的咒语是在 if 之后有一个 else ++jt; 并从 for 循环头中删除增量。
猜你喜欢
  • 2016-11-01
  • 2017-03-09
  • 2015-01-08
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 2012-03-31
相关资源
最近更新 更多