我试图提出以最有效的方式从容器(地图,矢量)访问/检索对象的技术。
所以,如果我有对象:
class Person
{
public:
string name;
unsigned int ID; // unique ID
double deposit;
};
// And then I have a vector of pointers to person objects
std::vector <Person*> people;
Person* getPerson( string nName );
Person* getPerson( unsigned int nID ); // what would be a good method to quickly identify/retrieve the correct Person object from my vector?
我的想法:
这是效率不高的迭代解决方案:
Person* getPerson( string nName )
{
for (int i=0; i<people.size(); i++)
{
if (people[i]->name == nName ) { return people[i]; }
}
}
另一种方式:拥有2张地图
map <string, Person*> personNameMap;
Person* getPerson( string nName )
{
return personNameMap[nName];
}
map <string, Person*> personIDMap;
Person* getPerson( unsigned int nID )
{
char id[2];
atoi( nID, id, 10 ); // or is it itoa?
return personNameMap[id];
}
我可以存储的任何其他想法&amp;从快速和快速的集合中检索我的对象高效的庄园?
答案 0 :(得分:1)
std::map
将其元素存储在平衡树结构中,并提供非常好的查找速度。但是出于同样的原因,在std::map
中插入比在序列容器中慢。因此,map
是你的选择,如果你有很多观察和很少的插入。
除此之外,我不明白你为什么要map <string, Person*> personIDMap;
而不是map <unsigned int, Person*> personIdMap
。
答案 1 :(得分:1)
std::map
是一个平衡树,O(log n)
步骤可供搜索。 Boost offers boost::unordered_map
这是一个哈希映射。它渐渐变差(O(n^2)
),但平均而言表现更好。根据容器的丰满度,它是1-3个恒定的步骤。一旦容器被填满(这意味着密钥的值耗尽),将会有越来越多的冲突,性能将迅速降低。在大多数实施中,这发生在大约80%的饱满度。在大多数情况下这不是问题,但要注意这个限制。
答案 2 :(得分:0)
如果索引不是整数,Map是用C ++查找的最快容器 我希望这很好