2010-03-29 39 views
2

我有两个multimaps定义如此multimap phoneNums;和multimap numPhones;他们是某种电话注册表 - phoneNums包含密钥名称,第二个参数phonenumber,numPhones包含密钥电话号码,第二个是名称。我想从两者中优化擦除当我想删除字符串键形式phoneNums,这也是numPhones中的第二个元素。当我输入所以其实是相同的,但与第一交换和第二 当我把它在测试中,它在两个屈德宁输入的数据它说,擦除速度太慢 - N * N,并且必须是n只有如何优化从multimap擦除

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);       
         }      
        } 
+0

您是否要求我们给您作业或面试问题的答案? – Omnifarious 2010-03-29 06:20:18

回答

3

更一般地,对于这样的问题,你可以使用下面的工艺:

  • 的容器,它保存数据
  • 几个指标,这点到上述数据

如果沿数据放置反向索引(以便指向索引中引用的位置此文件),然后就可以有效地去除任何项目:

  • 看看它采用最合适的索引(取决于你拥有的信息)
  • 删除各个指标的参考值(你有迭代器他们,所以它的效率)
  • 删除这可能变得单调乏味的数据本身

,但它是什么Boost.MultiIndex是:)

对于非常特殊的情况下,你在说,在MultiIndex库上面有一个叫做Boost.Bimap的包装器,如Jack所述。

+0

地图迭代器是否保证在插入和删除时保持稳定?哈希映射也是如此吗? 对我来说,一般的解决方案是使用数据在其他索引中查找项目并在那里删除它们。 – Omnifarious 2010-03-29 14:33:32

+0

'list','map'和'set'提供稳定性:迭代器有效直到删除指向的元素。对于'unordered_map',我不知道标准强加的保证。值得咨询我猜想的最终草案。至于再次寻找...它不是那么高效。因此,也许一个杰出的方法(取决于基础类型的指数)会更好。 – 2010-03-29 14:42:17

3

为什么你没有为你的问题使用更合适/特定的数据结构,如Bimap

升压具有one ..