【发布时间】:2014-10-21 05:44:29
【问题描述】:
在我的应用程序中,我存储了一组包含 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 ... */
}
我可以采取哪种方法来改进外部参考的查找?
我考虑过以下选项。
- 2 个映射都指向同一个事物,但键入不同的值。
- 一个简单的数据库(sqlite)。也许可以,但可能有点矫枉过正。
- 维护另一个映射,将外部参考映射到内部参考。
其中第 3 个选项似乎是最理智的。有没有更好的选择?
【问题讨论】:
-
this is painful to consider为什么要考虑而不是实际测量? -
为什么需要两个 id?谁决定他们?即 35 和 50 是从哪里来的?用户等?
-
一个是指数据库中的对象(长期建立的系统不是我创建的),这就是我在从系统接收有关它的更新时识别该对象的方式。另一个是客户端应用程序如何从外部接口引用对象。
-
@PaulRooney 在那种情况下 3 可能是明智的,只是为了理智。
标签: c++ data-structures