【问题标题】:Can't understand the problem with iterator?无法理解迭代器的问题?
【发布时间】:2019-11-03 14:39:05
【问题描述】:

The problem 表示我们必须找到要删除的最小学生数,以便第 i 个学生可以通过考试。因此,我基本上是将学生添加到一个多重集中,因为它存储排序后的值,虽然排序后的总和大于要求的分数,但我们将其减去并移至下一个。

问题在于输入:

3 4 3 9 1 1 9 8 9

with m : 需要通过的分数是 14

此处输入的第 6 个索引,即 9,尚未添加到多重集,正在以某种方式被删除。

运行有问题的输入时我得到的输出:

0 0 0 ;4--;3-- 2 ;9-- 1 ;9-- 1 ;9--;4--;9-- 3 ;9--;9--;9-- 3 ;9--;9--;9--;9-- 4

:""-- 中的值包含从 sum 中减去的 *x 有一个额外的 9 但我不知道如何?

multiset<int> st;
    int setsum =0;
    for(int i=0;i<n;i++)
    {
        int sum = setsum+ar[i];
        if((sum)<=m)
        {
            cout<<"0 ";
        }
        else
        {
            //cout<<sum<<"-*";
            int cnt = 0;
            auto x = st.rbegin();
            while(sum>m)
            {
                sum -= *x;
                //cout<<";"<<*x<<"--";
                x--;
                //if(i==3)
                    //cout<<*x<<"++";
                cnt++;
            }
            cout<<" "<<cnt<<" ";
        }
        st.emplace(ar[i]);
        setsum += ar[i];
    }

【问题讨论】:

  • ll 顺便代表 long long int
  • ll 顺便表示 long long int 我的建议是下次您在 StackOverflow 发帖时搜索并替换您的在将代码添加到问题之前将其删除。
  • @drescherjm 是的,用 int 家伙替换了它,对不起我的错。
  • 这似乎是learn how to debug your programs 的好时机,
  • @HardikMehta:我没有投反对票,但“为什么我的代码不起作用?”中更重要的事情之一问题是提供minimal reproducible example。您还没有这样做,因为问题中的代码不足以重现问题(我无法将其复制到源文件中,编译并运行它以重现您的行为),您也没有提供预期的输出,让人们更难帮助你。

标签: c++ stl iterator multiset


【解决方案1】:

可能不是唯一的问题,但我不禁注意到您使用反向迭代器的两个主要错误:

  1. 你递减迭代器(--x)而不是递增它(++x);反向迭代器的全部意义在于方向是反向的,因此您应该递增迭代器以向后移动通过st。您使用 --x 的唯一原因是,如果您有双向迭代器并且想要与“自然”迭代顺序相反(因此正向迭代器将向后运行,而反向迭代器将向前运行)。
  2. 您永远不会检查您是否已到达st 的末尾;如果你在sum &gt; m 之前跑完了st 的结尾(我们没有m 的定义,因此在跑完st 的结尾之前无法判断这个条件是否一定成立),你打未定义的行为。最简单的解决方法是简单地将测试更新为while (sum &gt; m &amp;&amp; x != st.rend()),尽管这可能会影响您以后的代码逻辑(因为现在退出循环并不能保证sum 小于或等于m),因此需要进一步测试。

【讨论】:

    猜你喜欢
    • 2018-09-09
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 2012-07-18
    • 1970-01-01
    相关资源
    最近更新 更多