0

このコードのチャンクでは、マップにペアを追加し、すべて問題ありませんが、最後のペアではないペアを削除すると、マップはそれ以上ペアを追加しません。私が間違っていることは何ですか??

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 は次のように宣言されます。

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

これは削除コードです:

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 の場合:

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

助言がありますか???

4

1 に答える 1

7

マップのサイズをキーイングしていますが、これが問題を引き起こす可能性があるようです。

したがって、マップに 3 つのものがあれば、次のようになります。

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

これらの要素の 1 つ、たとえば 1 を削除すると、次のようになります。

  2 => Obj2
  3 => Obj3

その後、挿入に移動し、キーを「size() + 1」に設定します。サイズは 2 を返し、キー 2 + 1 == 3 で挿入しようとします。3 は既に取得されています。したがって、上書きされるか失敗します(上記の検索がどのように機能するかはわかりません)。

サイズ + 1 で挿入する代わりに、最後のキーをチェックし、それがキーの管理方法である場合は 1 ずつ増やします。

于 2009-05-13T21:33:10.160 に答える