2009-05-13 5 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; 
} 

findメソッドの場合:

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つを削除する場合は、

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

を持つ1で言うだろう、あなたはその後、あなたがに行く

2 => Obj2 
    3 => Obj3 

を持っています挿入し、キーを "size()+ 1"に設定すると、サイズは2を返し、キー2 + 1 == 3に挿入しようとします。だから、上書きされたり失敗したりするでしょう(あなたの発見が上でどのように働いているかは分かりません)。

サイズ+ 1で挿入するのではなく、最後のキーを確認して、キーをどのように管理するかが1つ増えます。

+0

+1ただし、既に存在するキーにinsert(...)を使用すると、オーバーライドされません。戻り値は、新しい値が挿入されたかどうかを示します。 –

+0

は、[]または挿入(...)が使用されているかどうかによって決まります。これは、ファンキーなfind()呼び出しの結果に依存します。 –

+0

これに対処するためには、私はオブジェクトを削除した後にリストを再編成することになります。それはすべての悪の根源であるか、削除中ですが、私はエラーを見つけることができません –

関連する問題