在我的应用程序中,我存储了一组包含2个整数参考值的数据结构。
我正在使用带有内部引用的std :: map作为键,但这会让我遇到一个问题,如果我必须通过外部引用查找,我必须迭代整个映射到找到合适的条目。由于此列表可能包含数千个条目,因此需要考虑这一点。
以下代码显示了一个简单示例。
#include <iostream>
#include <map>
class MyData
{
public:
MyData(int internal_id, int external_id)
: internal_id_(internal_id), external_id_(external_id)
{}
int internal_id_;
int external_id_;
/* more data members ... */
};
int main(int argc, char** argv)
{
std::map<int, MyData*> datamap;
/*
Build the map structure with arbitrary values.
*/
for(int i = 0; i < 100; ++i)
{
MyData* md = new MyData(i, (100 - i));
std::cout << md->internal_id_ << " " << md->external_id_ << std::endl;
datamap.insert(std::make_pair(i, md));
}
/*
Find with internal id 50 Cheap lookup O(log N) (I think)
*/
std::map<int, MyData*>::iterator it1;
if((it1 = datamap.find(50)) != datamap.end())
{
std::cout << "Found Mydata with internal id 50 external id is " << it1->second->external_id_ << std::endl;
}
/*
Find with external id 35. Expensive lookup O(N)
*/
std::map<int, MyData*>::iterator it2;
for(it2 = datamap.begin(); it2 != datamap.end(); ++it2)
{
if(it2->second->external_id_ == 35)
{
std::cout << "Found with external id 35 internal id is " << it2->second->internal_id_ << std::endl;
break;
}
}
/* remove from map and clean up allocated MyData objects ... */
}
我可以采取哪种方法来改善外部参考的查找效果?
我认为以下是选项。
其中第三种选择似乎最为理智。还有更好的选择吗?
答案 0 :(得分:2)
push_back
改为vector
并使用std::binary_search
甚至interpolation search,否则unordered_map
或map
。一如既往 - 要知道什么是最快的,实施备选方案和衡量标准(但我已经按照预期的业绩顺序将它们列在上面)。
如果使用第一个或第三个选项,您可能希望将两个地图放入一个类中,以便插入&amp;删除在两者之间始终如一,并且链接到的对象仅在不需要时被删除(您也可以使用共享指针来管理它,但这可能有点重量级 - 取决于您的需求。
答案 1 :(得分:1)
将外部ID映射到内部id可能就足够了。这样一个对象总是可以找到它的任何一个id。如果您需要通过一个键删除某些内容,则可以找到它,确定它是另一个键,然后删除它及其外部键项。
(这样您就不必更改现有的查找代码,只需添加新地图)