2009-05-13 4 views
0

In diesem Stück Code füge ich ein Paar auf einer Karte und alles ist in Ordnung, aber wenn ich ein Paar, das nicht das letzte ist, die Karte nicht löscht Fügen Sie weitere Paare hinzu. Was mache ich falsch ??STL Karte fügt kein Paar nach dem Entfernen der ersten Paare

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

Object und OrderedObject erklärt sich wie folgt:

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

Dies ist der Löschcode:

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

Für find-Methode:

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

und für reorgObjectList:

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

Irgendwelche Vorschläge ???

+2

Wie machst du das Löschen? –

+1

Wo wird das Objekt deklariert? – jalf

+0

Sie sollten mehr Code posten ... wie es jalf andeutet, wo wird das Objekt deklariert? Es scheint, als könnte es hier andere Probleme geben, und wir können Ihnen vielleicht Vorschläge zu Nutzung, Stil und Design machen. Ich benutze Karten die ganze Zeit ... es scheint, dass ich sie nie so benutze. – Tom

Antwort

7

Nun, Sie sind auf die Größe der Karte Keying, scheint dies möglicherweise Ihre Probleme verursachen.

Also, wenn Sie 3 Dinge in der Karte haben, werden Sie

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

haben, wenn Sie eines dieser Elemente entfernen, sagen auf 1, werden Sie

2 => Obj2 
    3 => Obj3 

haben dann später Sie gehen zu einfügen, und setzen Sie den Schlüssel auf "size() + 1", Größe wird 2 zurückgeben, und Sie werden versuchen, bei Schlüssel 2 + 1 == 3 einfügen. 3 ist bereits vergeben. Es wird also entweder überschrieben oder fehlgeschlagen (nicht sicher, wie Ihr Fund oben funktioniert).

Anstatt in der Größe + 1 einzufügen, würde ich den letzten Schlüssel prüfen und um 1 erhöhen, wenn Sie so den Schlüssel verwalten möchten.

+0

+1 Wenn Sie jedoch insert (...) für einen bereits vorhandenen Schlüssel verwenden, wird dieser nicht überschrieben. Der Rückgabewert gibt an, ob der neue Wert eingefügt wurde oder nicht. –

+0

hängt davon ab, ob [] oder insert (...) verwendet wird ... was vom Ergebnis dieses funkigen find() Calls abhängt. Hes stand dort auf. –

+0

Das ist wahr, um damit umzugehen, ich reorganisiere die Liste nach dem Löschen eines Objekts. Vielleicht ist das die Wurzel aller Übel oder ist in der Löschung, aber ich kann den Fehler nicht finden –