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

Fast Retrieval of a Specific Object from a Collection of Pointers

本文关键字:检索 对象 指针 集合      更新时间:2023-10-16

我正在尝试以最有效的方式从容器(map, vector,)中访问/检索对象。

如果我有对象:

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]; }
   }
}

另一种方式:有两个地图

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]; 
}

关于如何存储&在一个快速的&高效的庄园吗?

std::map将其元素存储在平衡的树结构中,并提供相当好的查找速度。但是由于同样的原因,在std::map中插入比在序列容器中插入要慢。因此,如果您有大量的查找和相当少的插入,map是您的选择。

除此之外,我不明白你为什么用map <string, Person*> personIDMap;而不是map <unsigned int, Person*> personIdMap

std::map为平衡树,O(log n)为搜索步骤。Boost提供boost::unordered_map,这是一个哈希映射。它是渐近更差(O(n^2)),然而,它的平均性能更好。根据容器的满度,它是1-3个恒定的步骤。一旦容器被填满(这意味着键值被耗尽),将会有越来越多的冲突,性能将迅速下降。在大多数实现中,这种情况发生在80%左右。在大多数情况下,这不是问题,但是要注意这个限制。

Map是c++中最快的查找容器,如果索引不是整数我希望这是好的