从指针集合中快速检索特定对象

时间:2011-05-05 11:03:12

标签: c++ pointers performance

我试图提出以最有效的方式从容器(地图,矢量)访问/检索对象的技术。

所以,如果我有对象:

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;从快速和快速的集合中检索我的对象高效的庄园?

3 个答案:

答案 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 ++查找的最快容器 我希望这很好