C++ std::map-在项目擦除后对映射值重新排序
你好 我正在使用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<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首先请注意术语,如果在映射上使用数组索引语法,则不“重新插入”,而是更新映射中的条目。是的,它也可以在向量中完成,只是更详细。在更新后的问题中显示的更新/插入代码与向量一样简单(您可能想在此处阅读)。