2014-12-31 2 views
0

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

#include <cmath> 
#include <cstdio> 
#include <list> 
#include <vector> 
#include <iostream> 
#include <algorithm> 
using namespace std; 

int findHigherSkillLevel(int skillLevel, list<int>::iterator *it, list<int> &list) { 
    if (it == NULL) return 0; 

    if (**it == (skillLevel + 1)) { 
    it = list.erase(it);  
    return 1 + findHigherSkillLevel(**it, it, list) + findHigherSkillLevel(**it, --it, list); 
    } 

    return 0; 
} 

int findLowerSkillLevel(int skillLevel, list<int>::iterator *it, list<int> &list) { 
    if (it == NULL) return 0; 

    if (**it == (skillLevel - 1)) { 
    it = list.erase(it); 
    return 1 + findLowerSkillLevel(**it, it, list) + findLowerSkillLevel(**it, --it, list); 
    } 

    return 0; 
} 

int findGroupsSizes(int skillLevel, list<int>::iterator *it, list<int> &list) { 
    if (it == NULL) return 0; 

    int groupSize = 1; 
    it = list.erase(it); 
    groupSize += findHigherSkillLevel(**it, it, list) + findLowerSkillLevel(**it, it, list); 

    return groupSize; 
} 

int main() { 
    int t; // the number of test cases 
    cin >> t; 
    vector<list<int> > skillLevels(t, list<int>()); 
    // input for each test case 
    for (int i = 0; i < t; i++) { 
    int n; // number of students for this test case 
    cin >> n; 

    // initialize the list for this test case 
    for (int j = 0; j < n; j++) { 
     int skillLevel; 
     cin >> skillLevel; 
     skillLevels[i].push_back(skillLevel); 
    } 
    } 

    // recursively scan lists for smallest teams 
    for (int i = 0; i < t; i++) { 
    int minGroupNumber = skillLevels[i].size(); 
    list<int>::iterator iterator = skillLevels[i].begin(); 
    int skillLevel = skillLevels[i].front(); 
    while (!skillLevels[i].empty()) { 
     int currentGroupSize = findGroupsSizes(skillLevel, &iterator, skillLevels[i]); 
     if (currentGroupSize < minGroupNumber) 
     minGroupNumber = currentGroupSize; 
     skillLevels[i].pop_front(); 
    } 
    cout << minGroupNumber << endl; 
    } 

    return 0; 
} 

Я уже знаю, что это вызывает ошибку, пытаясь вызвать функцию «Erase», как это: это = list.erase (это);

Который я ввел в код жирным шрифтом. Я не понимаю, почему это дает мне следующий результат, так как от того, что я понимаю, удалить() просто необходим итератор на месте списка будет удален ?:

teamFormation.cpp: In function ‘int findHigherSkillLevel(int, std::list<int>::iterator*, std::list<int>&)’: 
teamFormation.cpp:13:24: error: no matching function for call to ‘std::list<int>::erase(std::list<int>::iterator*&)’ 
    it = *list.erase(it);  
         ^
teamFormation.cpp:13:24: note: candidates are: 
In file included from /usr/include/c++/4.8/list:64:0, 
       from teamFormation.cpp:3: 
/usr/include/c++/4.8/bits/list.tcc:108:5: note: std::list<_Tp, _Alloc>::iterator std::list<_Tp, _Alloc>::erase(std::list<_Tp, _Alloc>::iterator) [with _Tp = int; _Alloc = std::allocator<int>; std::list<_Tp, _Alloc>::iterator = std::_List_iterator<int>] 
    list<_Tp, _Alloc>:: 
    ^
/usr/include/c++/4.8/bits/list.tcc:108:5: note: no known conversion for argument 1 from ‘std::list<int>::iterator* {aka std::_List_iterator<int>*}’ to ‘std::list<int>::iterator {aka std::_List_iterator<int>}’ 
In file included from /usr/include/c++/4.8/list:63:0, 
       from teamFormation.cpp:3: 
/usr/include/c++/4.8/bits/stl_list.h:1193:7: note: std::list<_Tp, _Alloc>::iterator std::list<_Tp, _Alloc>::erase(std::list<_Tp, _Alloc>::iterator, std::list<_Tp, _Alloc>::iterator) [with _Tp = int; _Alloc = std::allocator<int>; std::list<_Tp, _Alloc>::iterator = std::_List_iterator<int>] 
     erase(iterator __first, iterator __last) 
    ^
/usr/include/c++/4.8/bits/stl_list.h:1193:7: note: candidate expects 2 arguments, 1 provided 
teamFormation.cpp: In function ‘int findLowerSkillLevel(int, std::list<int>::iterator*, std::list<int>&)’: 
teamFormation.cpp:24:24: error: no matching function for call to ‘std::list<int>::erase(std::list<int>::iterator*&)’ 
    it = *list.erase(it); 
         ^
teamFormation.cpp:24:24: note: candidates are: 
In file included from /usr/include/c++/4.8/list:64:0, 
       from teamFormation.cpp:3: 
/usr/include/c++/4.8/bits/list.tcc:108:5: note: std::list<_Tp, _Alloc>::iterator std::list<_Tp, _Alloc>::erase(std::list<_Tp, _Alloc>::iterator) [with _Tp = int; _Alloc = std::allocator<int>; std::list<_Tp, _Alloc>::iterator = std::_List_iterator<int>] 
    list<_Tp, _Alloc>:: 
    ^
/usr/include/c++/4.8/bits/list.tcc:108:5: note: no known conversion for argument 1 from ‘std::list<int>::iterator* {aka std::_List_iterator<int>*}’ to ‘std::list<int>::iterator {aka std::_List_iterator<int>}’ 
In file included from /usr/include/c++/4.8/list:63:0, 
       from teamFormation.cpp:3: 
/usr/include/c++/4.8/bits/stl_list.h:1193:7: note: std::list<_Tp, _Alloc>::iterator std::list<_Tp, _Alloc>::erase(std::list<_Tp, _Alloc>::iterator, std::list<_Tp, _Alloc>::iterator) [with _Tp = int; _Alloc = std::allocator<int>; std::list<_Tp, _Alloc>::iterator = std::_List_iterator<int>] 
     erase(iterator __first, iterator __last) 
    ^
/usr/include/c++/4.8/bits/stl_list.h:1193:7: note: candidate expects 2 arguments, 1 provided 
teamFormation.cpp: In function ‘int findGroupsSizes(int, std::list<int>::iterator*, std::list<int>&)’: 
teamFormation.cpp:35:22: error: no matching function for call to ‘std::list<int>::erase(std::list<int>::iterator*&)’ 
    it = *list.erase(it); 
        ^
teamFormation.cpp:35:22: note: candidates are: 
In file included from /usr/include/c++/4.8/list:64:0, 
       from teamFormation.cpp:3: 
/usr/include/c++/4.8/bits/list.tcc:108:5: note: std::list<_Tp, _Alloc>::iterator std::list<_Tp, _Alloc>::erase(std::list<_Tp, _Alloc>::iterator) [with _Tp = int; _Alloc = std::allocator<int>; std::list<_Tp, _Alloc>::iterator = std::_List_iterator<int>] 
    list<_Tp, _Alloc>:: 
    ^
/usr/include/c++/4.8/bits/list.tcc:108:5: note: no known conversion for argument 1 from ‘std::list<int>::iterator* {aka std::_List_iterator<int>*}’ to ‘std::list<int>::iterator {aka std::_List_iterator<int>}’ 
In file included from /usr/include/c++/4.8/list:63:0, 
       from teamFormation.cpp:3: 
/usr/include/c++/4.8/bits/stl_list.h:1193:7: note: std::list<_Tp, _Alloc>::iterator std::list<_Tp, _Alloc>::erase(std::list<_Tp, _Alloc>::iterator, std::list<_Tp, _Alloc>::iterator) [with _Tp = int; _Alloc = std::allocator<int>; std::list<_Tp, _Alloc>::iterator = std::_List_iterator<int>] 
     erase(iterator __first, iterator __last) 
    ^
/usr/include/c++/4.8/bits/stl_list.h:1193:7: note: candidate expects 2 arguments, 1 provided 

ответ

0

Сообщение об ошибке само за себя : в этот момент it не является std::list::iterator, это на самом деле std::list::iterator*. Вы должны разыменовать указатель (как и в предыдущей строке).

+0

Так что я должен разыгрывать его соответствующим образом? – mudejar

+0

Да, вообще говоря, «Тип» и «Тип *» - разные типы, и вы должны использовать их соответствующим образом. В этом случае вы либо разыгрываете указатель, либо вообще теряете указатель и используете ссылку. – Ionut

+0

Теперь он работает, я меняю it = list.erase (it) на * it = list.erase (* it), и все в порядке. Спасибо за помощь! – mudejar

Смежные вопросы