C++ std::map-在项目擦除后对映射值重新排序

C++ std::map-在项目擦除后对映射值重新排序,c++,stl,stdmap,C++,Stl,Stdmap,你好 我正在使用std::map将表的行条目绑定到键项 例如: std::map<int,int> myMap; myMap[13]=0; myMap[15]=1; myMap[1]=2; myMap[5]=3; ... ... std::map myMap; myMap[13]=0; myMap[15]=1; myMap[1]=2; myMap[5]=3; ... ... 添加/更新项目操作 std::map<int,int>::iterator it; it=r

你好

我正在使用std::map将表的行条目绑定到键项

例如:

std::map<int,int> myMap;

myMap[13]=0;
myMap[15]=1;
myMap[1]=2;
myMap[5]=3;
...
...
std::map myMap;
myMap[13]=0;
myMap[15]=1;
myMap[1]=2;
myMap[5]=3;
...
...
添加/更新项目操作

std::map<int,int>::iterator it;
it=result_RecordList.find(methodID);
if(it==result_RecordList.end())
{
    //new item , new row record
}
else
{
    //get record row id and update that item    
}
std::map::iterator;
it=result\u RecordList.find(methodID);
if(it==result\u RecordList.end())
{
//新项目,新行记录
}
其他的
{
//获取记录行id并更新该项
}
键实际上是它在表上显示的objectID

一旦我删除了第2行;我希望myMap[5]现在映射到第2行

我不能使用行id作为键,因为我经常使用objectID引用表

如果映射元素在插入时保持其顺序,那么我将更容易重新分配映射到键的值,即使无序的映射也不会这样做

欢迎任何解决办法, 谢谢你


目前我已经想到了这一点。欢迎任何有效的解决方案

//after myMap erase item
std::map<int,int>::iterator itReassign;

for(itReassign=myMap.begin();itReassign!=myMap.end();itReassign++)
{//for loop
    if(itReassign->second>rowID)//all value above the rowID will be downshifted
    itReassign->second=itReassign->second-1;
}//for loop
//在myMap擦除项之后
std::map::迭代器itReassign;
对于(itReassign=myMap.begin();itReassign!=myMap.end();itReassign++)
{//for循环
if(itReassign->second>rowID)//所有高于rowID的值都将降档
itReassign->second=itReassign->second-1;
}//for循环

解决问题的一个可能方法可能是简单地使用包含对象标识符的。按照希望显示的顺序在向量中插入对象ID,然后从头到尾循环向量以显示项目。如果随后从向量中删除对象id,则会自动将其下方的对象id上移一步

但是,此解决方案会将
std::map
的O(1)访问权限更改为O(n),以查找特定对象id的行



另一种可能的解决方案是使用您现在拥有的方案,但不要将
std::map
中的值视为行,而只是作为排序顺序。不过,如果你选择a,可能会更好,所以你可以双向选择。

使用新的解决方案,你可以尝试上限法 然后迭代直到结束

myMap.std::map<char,int>::iterator itup = = myMap.upper_bound (rowId);
while(itup!=myMap.end();++itup)
{
    (*itup)--;
}
myMap.std::map::iterator itup==myMap.upper_-bound(rowId);
while(itup!=myMap.end();++itup)
{
(*itup)--;
}

+1-我看不到任何替代方法,无论是O(n)搜索还是行删除时的“重新索引”,即使使用bimap…@Joachim,我不能使用
std::vector
stl::map
允许我再次插入相同的objectID,以便我可以将新信息更新到同一行。我已经更新了问题以显示this@JamesG首先请注意术语,如果在映射上使用数组索引语法,则不“重新插入”,而是更新映射中的条目。是的,它也可以在向量中完成,只是更详细。在更新后的问题中显示的更新/插入代码与向量一样简单(您可能想在此处阅读)。