如何优化多图的擦除

时间:2010-03-29 06:13:07

标签: c++

我定义了两个multimaps,因此multimap phoneNums;和multimap numPhones;它们是某种电话注册表 - phoneNums包含密钥名称,第二个参数是phonenumber,numPhones包含Key phonenumber,第二个是name。当我想删除字符串键形式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);                           
                        }                       
                    }

2 个答案:

答案 0 :(得分:3)

为什么不为 Bimap 等问题使用更合适/特定的数据结构?

Boost有one ..

答案 1 :(得分:3)

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

  • 容纳数据的容器
  • 几个指向上述数据的索引

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

  • 使用最合适的索引查找(取决于您拥有的信息)
  • 删除各种索引中的引用(你有迭代器,所以效率很高)
  • 删除数据本身

这可能看起来很乏味,但这是Boost.MultiIndex的用途:)

对于您所说的非常具体的案例,Jack提及的MultiIndex库上方有一个名为Boost.Bimap的包装器。