无法理解迭代器的问题?

时间:2019-06-20 18:09:36

标签: c++ stl iterator multiset

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

问题来自输入:

3 4 3 9 1 1 9 8 9

带有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

:“”中的值包含* 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];
    }

1 个答案:

答案 0 :(得分:1)

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

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