Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从指针集合快速检索特定对象_C++_Pointers_Performance - Fatal编程技术网

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

C++ 从指针集合快速检索特定对象,c++,pointers,performance,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;

我正试图想出一种技术,以最有效的方式从容器(地图、向量等)中访问/检索对象

如果我有目标:

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?
班级人员
{
公众:
字符串名;
无符号整数ID;//唯一ID
双重存款;
};
//然后我有一个指向person对象的指针向量
性病患者;
Person*getPerson(字符串名称);
Person*getPerson(未签名的int-nID);//从向量中快速识别/检索正确的Person对象的好方法是什么?
我的想法是:

这是无效的迭代解决方案:

Person* getPerson( string nName )
{
   for (int i=0; i<people.size(); i++)
   {
      if (people[i]->name == nName ) { return people[i]; }
   }
}
Person*getPerson(字符串名称)
{
对于(int i=0;iname==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]; 
}
map personNameMap;
Person*getPerson(字符串名称)
{
return personNameMap[nName];
}
地图人物地图;
Person*getPerson(未签名整数nID)
{
字符id[2];
atoi(nID,id,10);//还是itoa?
返回personNameMap[id];
}

<> P>其他任何想法我如何能在快速高效的庄园中从一个集合中存储和检索我的对象?< /p> map是最快的容器,如果索引不是整数,那么C++中的查找是最快的容器。
我希望这是好的

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


除此之外,我不明白你为什么制作
map personIDMap
而不是
映射personIdMap

std::map
是一个平衡树,它是用于搜索的
O(log n)
步骤<代码>boost::无序_映射这是一个哈希映射。它的性能逐渐变差(
O(n^2)
),但平均而言,它的性能更好。根据容器的满度,它是1-3个恒定步骤。一旦容器被填满(这意味着键的值被耗尽),就会发生越来越多的冲突,性能会迅速下降。在大多数实现中,这发生在大约80%的满度。这在大多数情况下都不是问题,但要注意这一限制。

好的,但我希望能够通过姓名和ID(编号)查找个人的,那么您会怎么做-创建2个容器,在按姓名查找时创建一个映射,在按ID查找时创建一个向量/数组。或者您会使用模板函数来执行此操作?我正在尝试学习如何从收藏中组织和检索对象。保留两个容器。一张名为ToidMap的地图。和一个向量。但是,id和索引应该匹配。当您想要查找它时,只需返回objVec[index]
(其中index应该是id)
。对于名称,使用名称作为键从映射中搜索索引,并返回objVec[index]。但为了使这些有效地工作,您需要知道向量的大小,以便在填充之前可以对其进行初始化。然后像objVec[id]=“Person”一样填充向量,避免返回ppush_。感谢您的回复。是的,我对地图还不熟悉,我认为它们是Python字典,所以我必须摆脱我的想法,只有字符串可以用作键。有没有关于快速查找/检索指针对象的技术的建议?或者您会使用两种有序映射(按名称(字符串作为键))和(按ID(无符号int作为键))?根据您的目的,您可以使用两种
映射或Mayank提出的解决方案。如果您更频繁地按名称使用
查找,则
两个映射
似乎更好,如果按名称使用
和按id使用
查找的频率相等,则
映射+向量
解决方案更好。在这两种情况下,您都必须提供一致性(在两个映射之间或映射和向量之间)。感谢您的回复。当你说full时,比如说我们正在讨论一个使用字符串作为键的映射,当性能开始下降时,映射会有多大。我知道你说了80%,但就大小而言,如果字符串键必须是空的,那会是10000吗大多数编译器都提供哈希映射,要么在
std::tr1::unordered_map
下,要么在旧的SGI名称
std::hash_map
下(尽管VisualC++在签名上与SGI版本略有不同)。支持C++0x的编译器将其作为
std::unordered\u map
提供。这通常与boost版本相同。
map
没有问题,因为这是一个平衡树(我想是红黑树,但我不确定)。我不认为10000是无序地图的问题。(10000/(256^3)比80%小。@Jan:谢谢你的澄清,我不知道实施细节。ás,@user593747:这永远不会是问题。当两个不同键的哈希值相同时,会发生冲突。散列值是
size\t
(对容器大小进行模化,但会根据需要增加),因此保证在散列值空间耗尽之前耗尽内存。您的实际密钥空间小于该值这一事实不会导致任何额外的冲突。