我知道搜索已排序的向量远比搜索未排序的向量快得多。当向量存储字符串时,这是可以理解的。我的问题是假设一个向量存储对象或指向类的对象的指针。这个类有两个属性,比如SSN和年龄。已经有两个谓词可用于(std :: find_if)的向量,一个用于搜索SSN(字符串),另一个用于搜索年龄(int)。我的问题是对这种载体进行分类的最佳实践是什么。
答案 0 :(得分:6)
这里没有最好的做法。如果要按SSN搜索对象,请按SSN排序。如果要按年龄搜索对象,请按年龄排序。如果要同时搜索(或者),则不要使用向量。使用Boost.MultiIndex
中的内容。
顺便说一下,如果您使用二分搜索(lower_bound
,upper_bound
或equal_range
),搜索只会在排序后的矢量上更快,而不是线性搜索,这就是{ {1}}确实。
答案 1 :(得分:2)
这取决于你对矢量的使用,如果你必须根据年龄进行搜索,那么使用年龄,如果它是SSN,那么使用SSN。
Altough,如果你使用SSN(为什么不是一个整数?) 最好的做法可能是使用std :: unordered_map。
这是因为SSN是唯一的。
答案 2 :(得分:1)
当你想要对某些东西进行排序时,最好的做法是首先问自己:什么函数应该确定是否< B'
定义函数并将其用于排序。
答案 3 :(得分:0)
转移到“较重”的多键数据结构的一个缺点是(如Boost.MultiIndex提供的那些),根据您的使用情况,您可能会失去一些位置和性能。
考虑容器的元素数量和访问模式。
如果您正在构建一个容器,然后再从不修改它,但是进行大量查找,您可能会发现只需创建和填充vector
,制作副本,以及以不同的方式对这两个副本进行排序成为你想成为的人。 (如果您想避免数据的重复完整副本的开销,并且不介意单个额外的间接级别,您可以考虑让容器包含shared_ptr
。)
如果您倾向于一次性执行大量Age
个查询,则切换到SSN
个查询,可能会以一种方式排序,执行查询,另一种方式排序,然后执行其他查询查询会很好 - 再次,它取决于排序之间的查询数量。
如果您的数据结构足够小(数十项或更少),您可能会发现对您的一种查找类型进行线性搜索就可以了,您可以将vector
排序为另一种类型的查找 - 特别是如果您倾向于支持一种类型的查找。
您也可以考虑将Person
分成几部分 - 有点像数据库规范化 - 并且有一个容器“只”包含SSN
s和某种句柄或{{1}另一个只包含PersonKey
和密钥,以及包含密钥和其余部分的最终容器。这有助于使您的搜索保持在本地(请参阅“结构数组”与“数组结构”)。
这些都可能会增加代码复杂性和维护成本,因此通常的“您的里程可能会有所不同”声明适用。您可能会与这些解决方案进行权衡。