Карта STL не добавляет пару после удаления первых пар - PullRequest
0 голосов
/ 14 мая 2009

В этом фрагменте кода я добавляю пару на карту, и все в порядке, но когда я удаляю пару, которая не является последней, карта не добавляет больше пар. Что я делаю не так ??

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 и orderObject объявляются следующим образом:

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

Есть предложения ???

1 Ответ

7 голосов
/ 14 мая 2009

Ну, вы указываете размер карты, похоже, это может вызвать ваши проблемы.

Так что, если у вас есть 3 вещи на карте, у вас будет

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

если вы удалите один из этих элементов, скажем, на 1, у вас будет

  2 => Obj2
  3 => Obj3

затем вы перейдете к вставке и установите ключ в «size () + 1», размер вернет 2, и вы попытаетесь вставить при ключе 2 + 1 == 3. 3 уже занято Так что он будет либо переопределен, либо потерпит неудачу (не уверен, как работает ваша находка выше).

Вместо вставки с размером + 1, я бы проверил последний ключ и увеличил его на 1, если вы хотите управлять ключом.

...