Почему итератор не идентифицирует тип данных мультимножества в вызываемой функции? - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь найти оптимизированный способ решения этой проблемы -

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);
                 ^

Как я уже говорилранее я хотел бы узнать причину, по которой итератор в вызываемой функции не идентифицирует тип данных мультимножества.

1 Ответ

0 голосов
/ 11 октября 2019

Первая проблема:

Вы хотите получить доступ к данным, на которые указывает итератор, а не к самому итератору. Поэтому вам просто нужно заменить:

k-=itt->second;

Следующая задача:

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

Это определяет ваш ref a2 как const. Как const, вы не можете изменить свой мультимножество. Таким образом, вы должны удалить const здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...