从指针集合中快速检索特定对象
Fast Retrieval of a Specific Object from a Collection of Pointers
我正在尝试以最有效的方式从容器(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++中最快的查找容器,如果索引不是整数我希望这是好的
相关文章:
- 如何检索由带通配符的字符串索引的对象
- 用于从可能不存在的容器中检索对象的 API 设计
- 在 c++ 中使用指向对象的指针检索数据
- 通过 std::bind 从对象成员检索值
- 将 JSON 对象作为参数在 JNI 中传递给 CPP,并在 CPP 中检索 JSON 对象的数据
- C++ 从树中检索对象
- 检索不同类型的对象指针
- 如何在Boost Serialization中检索多个对象值
- 使用Boost序列化保存和检索多个对象
- C++ 无法检索自定义矢量中的对象
- 如何通过先前存储的ID从结构对象中检索值?C
- 在另一个中检索JSON对象
- c++使用字符串句柄对对象进行通用存储和检索
- 插入>>运算符重载:从 CIN 检索对象的 CTOR 参数时的异常处理
- 根据对象的类型从矢量中检索对象
- 仅检索对象的类型
- 从数组中检索对象的值
- 从boost::optional中检索对象
- 从映射中检索对象实例
- 检索对象的函数操作符的参数类型