C++ 如何优化多重映射中的擦除

C++ 如何优化多重映射中的擦除,c++,C++,我定义了两个多重映射,所以多重映射音素;和多地图手机;它们是某种电话注册表-phoneNums包含键名,第二个参数phonenumber,numPhones包含键phonenumber,第二个参数是名称。当我想删除字符串键形式的phoneNums时,我想优化这两个元素的擦除,这也是numPhones中的第二个元素。当我输入数据时,它被输入到两个多重贴图中,因此它们实际上是相同的,但第一个和第二个贴图是交换的 当我把它放在测试上时,它说擦除太慢了-N*N并且必须只有N cin>>str

我定义了两个多重映射,所以多重映射音素;和多地图手机;它们是某种电话注册表-phoneNums包含键名,第二个参数phonenumber,numPhones包含键phonenumber,第二个参数是名称。当我想删除字符串键形式的phoneNums时,我想优化这两个元素的擦除,这也是numPhones中的第二个元素。当我输入数据时,它被输入到两个多重贴图中,因此它们实际上是相同的,但第一个和第二个贴图是交换的 当我把它放在测试上时,它说擦除太慢了-N*N并且必须只有N

cin>>stringToErase;
                    phoneNums.erase(stringToErase);
                    multimap<string, string>::iterator it;
                    multimap<string, string>::iterator tmpr;
                    for(it = numPhones.begin(); it != numPhones.end();it++)
                    {

                        if(it->second == tringToErase)
                        {   
                            tmpr = it;      
                            numPhones.erase(it,tmpr);                           
                        }                       
                    }
cin>>stringToErase;
音素擦除(stringToErase);
多重映射::迭代器;
迭代器tmpr;
for(it=numPhones.begin();it!=numPhones.end();it++)
{
如果(它->秒==tringToErase)
{   
tmpr=it;
擦除(it,tmpr);
}                       
}

您为什么不针对您的问题使用更合适/更具体的数据结构,如Bimap


Boost有..

更一般地说,对于此类问题,您可以使用以下技术:

  • 保存数据的容器
  • 指向上述数据的几个索引
如果沿数据放置反向索引(以便指向索引中引用此项的位置),则可以有效地删除任何项:

  • 使用最合适的索引查找(取决于您拥有的信息)
  • 删除各种索引中的引用(您有对它们的迭代器,因此它是有效的)
  • 删除数据本身
这可能看起来很乏味,但这是为了:)


对于您提到的非常具体的案例,在多索引库上方有一个包装器,如
Jack

所述。您是否要求我们为您提供家庭作业或面试问题的答案?是否保证映射迭代器在插入和删除过程中保持稳定?hashmap也是这样吗?对我来说,一般的解决方案是使用数据在其他索引中查找项目,并在那里删除它们。
list
map
set
提供稳定性:迭代器在删除它指向的元素之前是有效的。对于
无序的地图
,我不知道标准规定的保证。我想最后的草稿值得一看。至于再找一次。。。效率不高。因此,也许一种独特的方法(取决于指数的基本类型)会更好。