2010-05-17 5 views
0

여기에서 문제가 발생했습니다. C++ 멀티 세트를 사용하고 있습니다. 이것은 테스트 파일입니다.C++ Set 항목 지우기 질문

Score: 3-1 
Ben 
Steven 
Score: 1-0 
Ben 
Score: 0-0 
Score: 1-1 
Cole 
Score: 1-2 
Ben 

while 루프와 ifstream (fin1)을 사용하여 위의 테스트 파일을 읽습니다.

multiset<string, less<string> > myset; 

while(!fin1.eof()) 
{ 

fin1 >> scoreName; 

if(scoreName == "Score:")            
{ 
    //calculates number of matches played 
} 
else 
{ 
    goalCheck = scoreName.substr(1,1); 
    if(goalCheck == "-") 
    { 
     string lGoal, rGoal; 
     lGoal = scoreName.substr(0,1); 
     rGoal = scoreName.substr(2,1); 

     int leftGoal, rightGoal; 
     leftGoal = atoi(lGoal.c_str()); 
     rightGoal = atoi(rGoal.c_str()); 

     if(leftGoal > rightGoal) //if team wins 
     { 
      //some computations 
     } 
     else if(leftGoal < rightGoal) //if team loses 
     { 
      //computations 
     } 
     else if(leftGoal == rightGoal) //if team draws 
     { 
      //computations 
     } 
     else 
     { 
      myset.insert(myset.begin(), scoreName); 
     } 
    } 
} 

나는 내 마지막 else 문의 요소인지에 모든 이름을 (에 관계없이 승// 손실 무)에 삽입하고있다. 하지만 우승 한 선수의 이름 만 필요합니다.

일치 항목이 손실 된 이름은 myset에 포함되지 않습니다. 위 테스트 파일에는 잃어버린 (1-2) 파일이 하나뿐이므로 "Ben"을 제거하려고합니다. 어떻게해야합니까?

나는 myset.erase()를 사용하려고 시도했으나 Ben을 가리키고 myset에서 제거하는 방법을 모르겠습니다.

어떤 도움

이 많이 감사합니다. 감사합니다. .

답변

0

난 당신이 뭘 하려는지 이해한다면, 나는 팀이 있었다는 것을 기억하기 쉬울 것이라고 생각 : 당신이 세트로 여부를 Score 개체를 삽입할지 여부를 결정하기위한 그 다음은 쉬울 것이다 "Score"라인을 읽고 팀이 분실하지 않은 경우에만 다음 라인 (예 : "Ben")을 삽입 할 때 승리, 추첨 또는 분실. 모두 삽입 후 원하지 않는 것들을 지우는 것은 나에게 너무 복잡해 보입니다. :)

참고 : 지울 필요가 있다면 find() 회원을 사용하여 주어진 키와 일치하는 항목을 찾은 다음 erase()을 리턴 된 반복자가 삭제를 확인한 후 (find()end()과 같은 반복자를 리턴하지 않았다는 것을 나타냅니다. 이는 항목을 찾을 수 없음을의 L합니다).

또한 begin()insert()으로 전달하면 안됩니다. 반복자는지도에서 항목을 삽입 할 수있는 위치에 대한 힌트입니다. 실제로는 거의 유용하지 않습니다. 이 함수에는 하나의 인수 (삽입 할 항목) 만 사용하는 오버로드가 있습니다.

+0

@Peter : 네, 맞습니다. 팀이 우승하거나 그려진 경우 득점 한 선수의 이름이 필요합니다. 팀이 졌으면 점수를 얻은 선수의 이름을 요구하지 않을 것입니다. 이렇게하는 간단한 방법이 있습니까? 나는 모든 이름을 삽입하고 잃어버린 그 이름들을 지우는 것이 복잡하다는 것을 안다. – Wallace

+0

@Wallace 실제로 그것은 전혀 복잡하지 않습니다. 그것은 당신이 당신의 세트를 크게 가질 것입니다. 그리고 나서 당신은 그것을 축소시킬 것이고, 그래서 그것은 성능 벌칙입니다. 그렇게하기 위해 제거 - 삭제 관용구를 적용합니다 : 한 줄의 코드. – wilhelmtell

+0

팀이 승리했는지, 그리고 당겼는지 나타내는 bool 플래그를 유지하고, 팀이이기거나 끌 때'true'로 설정하고 잃는다면'false'로 설정할 수 있습니다. 그런 다음 해당 플래그가 true 인 경우에만 삽입하십시오. 분명히 루프 외부에서 선언 할 필요가 있기 때문에 반복 할 필요가 없습니다. – Peter

0

Score 클래스를 만듭니다. 비회원 인 operator>>()을 추가하면 쉽게 파싱 할 수 있습니다.

if(scr.gained - scr.lost >= 0) 
    myset.insert(myset.begin(), scr); 
+0

하지만이 이름을 myset에 삽입합니까? 아니면 그냥 그 뒤에 3 개의 이름 대신에 "점수 : 3-1"을 myset에 삽입할까요? – Wallace

+0

'Score' 오브젝트에 이름 목록을 추가하거나'set' 대신'map'을 사용하여 이름에서 점수로 매핑 할 수 있습니다. – wilhelmtell