在这段代码中,我在地图上添加了一对,一切都很好但是当我删除一对不是最后一对时,地图不再添加任何对。我做错了什么?
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;
}
任何建议???
答案 0 :(得分:7)
嗯,你正在关注地图的大小,这似乎可能会导致你的问题。
因此,如果您在地图中有3件事,那么
1 => Obj1
2 => Obj2
3 => Obj3
如果你删除其中一个元素,比如1,你将有
2 => Obj2
3 => Obj3
然后你去插入,并将键设置为“size()+ 1”,大小将返回2,你将尝试插入键2 + 1 == 3. 3已经被采用。所以它会被覆盖或失败(不确定你的发现如何在上面工作)。
如果你想管理密钥,我会检查最后一个密钥并增加1,而不是插入大小+ 1。