2009-05-13 2 views
0

이 코드 덩어리에서는지도에 쌍을 추가하고 모든 것이 잘되지만지도가 마지막이 아닌 쌍을 삭제하면 괜찮습니다. 쌍을 더 추가하십시오. 내가 뭘 잘못하고있어 ??STL지도는 첫 번째 쌍을 제거한 후에 쌍을 추가하지 않습니다.

SomeClass::eraseNamed(std::string aName) 
{ 
    if (!isEmpty()) 
    { 
     ObjectList::iterator result; 
     result = find(aName); 
     if (result != ObjectList.end()) 
     { 
      ObjectList.erase(result); 
      reorgObjectList(); 
      return true; 
     } 

    } 
    return false; 
} 

찾기 방법 :

ObjectList::iterator SomeClass::find(std::string aName) 
{ 
    ObjectList::iterator result = ObjectList.begin(); 
    while (result != ObjectList.end()) 
    { 
     if (aName == result->second.name()) 
      return result; 
     result++; 
    } 
    return result; 
} 

및 reorgObjectList에 대한이 삭제 코드

typedef std::pair<int, Object> orderedObject; 
typedef std::map<int, Object> ObjectList; 

다음과 같이

SomeClass::add(Object object) 
if (!object.empty()) 
{ 
    ObjectList::iterator result = find(object.name()); 
    if (result == ObjectList.end()) 
    { 
     object.order(size() + 1); 
     ObjectList.insert(orderedObject(object.order(), object)); 
    } 
    else 
    { 
     ObjectList[result->first] = object; 
    } 
} 

통해 Objectlist 및 orderedObject 선언된다 :

bool SomeClass::reorgObjectList() 
{ 
    ObjectList::iterator i=ObjectList.begin(); 
    int j=1; 
    for (i = ObjectList.begin(); i != ObjectList.end(); ++i) 
    { 
     if(j!=i->second.order()) 
      i->second.order(j); 
     j++; 
    } 
    return true; 
} 

제안 사항 ???

+2

삭제를 어떻게 하시겠습니까? –

+1

개체가 선언 된 위치는 어디입니까? – jalf

+0

더 많은 코드를 게시해야합니다. jalf가 제안하는 것처럼, 객체가 선언 된 곳은 어디입니까? 여기에 다른 문제가있는 것처럼 보이며 사용법, 스타일 및 디자인에 대한 제안을 드릴 수 있습니다. 나는 항상지도를 사용합니다 ... 나는 결코 이런 식으로 사용하지 않는 것 같습니다. – Tom

답변

7

글쎄지도의 크기를 키잉하고 있습니다. 문제가 발생할 수도 있습니다. 당신이지도 3 일이 있으면

그래서 당신은 당신이이 요소 중 하나를 제거하면,

1 => Obj1 
    2 => Obj2 
    3 => Obj3 

이 1에서 말할 것이다, 당신은 나중에 당신이 이동

2 => Obj2 
    3 => Obj3 

이있을 것이다 삽입하고 키를 "size() + 1"로 설정하면 크기는 2를 반환하고 키 2 + 1 == 3에 삽입하려고 시도합니다. 3은 이미 사용되었습니다. 그래서 그것은 오버 라이드되거나 실패 할 것입니다 (당신의 발견이 어떻게 작동하는지 확실하지 않습니다).

크기를 + 1로 삽입하는 대신 키를 관리하려는 방법이 있다면 마지막 키를 확인하고 1 씩 증가시킵니다.

+0

+1 그러나 이미 존재하는 키에 insert (...)를 사용하면 오버라이드되지 않습니다. 반환 값은 새 값이 삽입되었는지 여부를 나타냅니다. –

+0

은 [] 또는 삽입 (...)이 사용되는지 여부에 달려 있습니다 ... 그것은 펑키 find() 호출의 결과에 따라 달라집니다. –

+0

사실, 이것을 처리하기 위해 나는 개체를 삭제 한 후에 목록을 재구성합니다. 아마도 모든 악의 뿌리이거나 삭제되고 있지만 오류를 찾을 수 없습니다. –

관련 문제