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

对于重组对象列表:

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,您将拥有

  2 => Obj2
  3 => Obj3

然后稍后你去插入,并将键设置为“size() + 1”,size 将返回 2,你将尝试在键 2 + 1 == 3 处插入。3 已经被占用。所以它要么被覆盖要么失败(不确定你的 find 在上面是如何工作的)。

如果您想管理密钥,我会检查最后一个密钥并增加 1,而不是插入大小 + 1。

于 2009-05-13T21:33:10.160 回答