C++ 如何优化多重映射中的擦除
我定义了两个多重映射,所以多重映射音素;和多地图手机;它们是某种电话注册表-phoneNums包含键名,第二个参数phonenumber,numPhones包含键phonenumber,第二个参数是名称。当我想删除字符串键形式的phoneNums时,我想优化这两个元素的擦除,这也是numPhones中的第二个元素。当我输入数据时,它被输入到两个多重贴图中,因此它们实际上是相同的,但第一个和第二个贴图是交换的 当我把它放在测试上时,它说擦除太慢了-N*N并且必须只有NC++ 如何优化多重映射中的擦除,c++,C++,我定义了两个多重映射,所以多重映射音素;和多地图手机;它们是某种电话注册表-phoneNums包含键名,第二个参数phonenumber,numPhones包含键phonenumber,第二个参数是名称。当我想删除字符串键形式的phoneNums时,我想优化这两个元素的擦除,这也是numPhones中的第二个元素。当我输入数据时,它被输入到两个多重贴图中,因此它们实际上是相同的,但第一个和第二个贴图是交换的 当我把它放在测试上时,它说擦除太慢了-N*N并且必须只有N cin>>str
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
提供稳定性:迭代器在删除它指向的元素之前是有效的。对于无序的地图
,我不知道标准规定的保证。我想最后的草稿值得一看。至于再找一次。。。效率不高。因此,也许一种独特的方法(取决于指数的基本类型)会更好。