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; 
} 

이미 오류가이 같은 "삭제"함수를 호출하려고 원인이 무엇을 알고 : 이 list.erase을 = (IT);

나는 코드에서 굵은 글씨체로 타이핑했다. 그것이 내가 (삭제 이해하는 것에서부터, 나에게 다음과 같은 출력을 제공 왜 난 그냥

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

오류 메시지가 자체 설명이다? 삭제할 목록의 위치에 반복자를 필요로) 이해가 안 돼요 : 그 시점에서 itstd::list::iterator이 아니며 실제로는 std::list::iterator*입니다. 포인터를 역 참조해야합니다 (이전 행 에서처럼).

+0

그래서 나는 그것을 적절하게 참조 해제해야합니까? – mudejar

+0

예, 일반적으로 '유형'과 '유형 *'은 다른 유형이므로 적절하게 사용해야합니다. 이 경우 포인터를 역 참조하거나 포인터를 모두 잃어 버리고 참조를 사용하십시오. – Ionut

+0

이제 작동합니다. list.erase (it)를 * it = list.erase (* it)로 변경하면됩니다. 도와 줘서 고마워! – mudejar

관련 문제