为什么迭代器不识别被调用函数中多重集的数据类型?

Why isn't the iterator not identifying the datatype of the multi-set in the called function?

我正在尝试找到解决此问题的优化方法-

https://www.codechef.com/KJCS2019/problems/TSHACK

int findanswer(int k,const multiset<pair<int,int> >&a2)
            {
                 int freq=0;
                     while(k>0)
                         {
                             multiset<pair<int,int> >::iterator itt=a2.end();
                             k-=itt.second;
                             a2.erase(itt);
                         ++freq;
                         }
                return freq;
            }
    int main()
{
            cin>>n>>q;
            map<int,int>a;
            multiset<pair<int,int> > a2;
            for(int i=0;i<n;i++)
            {
                int b;
                cin>>b;
                ++a[b];
            }
            for(auto it:a)
                a2.insert(make_pair(it.second,it.first));
            while(q--)
            {
                int k;
                cin>>k;
                int ans=findanswer(k,a2);
                cout<<ans<<endl;
            }
}

错误信息:

prog.cpp: In function 'int findanswer(int, const std::multiset<std::pair<int, int> >&)':
prog.cpp:18:16: error: 'std::multiset<std::pair<int, int> >::iterator {aka struct std::_Rb_tree_const_iterator<std::pair<int, int> >}' has no member named 'second'
         k-=itt.second;
                ^
prog.cpp:19:21: error: passing 'const std::multiset<std::pair<int, int> >' as 'this' argument discards qualifiers [-fpermissive]
         a2.erase(itt);
                 ^

正如我之前所说,我想知道被调用函数中的迭代器不识别多重集数据类型的原因。

第一个问题:

您想访问迭代器指向的数据而不是迭代器本身。所以你只需更换:

k-=itt->second;

下一题:

int findanswer(int k,const multiset<pair<int,int> >&a2)

这将您的参考 a2 定义为 const。作为 const 你不能修改你的多重集。所以你必须在这里删除const