Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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++ 与两个向量和线性搜索相比,std::map在哪一点对对象分组更有意义?_C++_Dictionary_Vector_Stl - Fatal编程技术网

C++ 与两个向量和线性搜索相比,std::map在哪一点对对象分组更有意义?

C++ 与两个向量和线性搜索相比,std::map在哪一点对对象分组更有意义?,c++,dictionary,vector,stl,C++,Dictionary,Vector,Stl,我试图将一个大型对象集合分类为一系列组,这些组代表了它们之间的某种共性 我似乎有两种方法可以做到这一点: 1) 我可以手工管理一切,把所有的对象分类成一个向量向量。然而,这意味着每当我想要为一个未分组的对象找到一个现有的组时,我必须迭代所有的上层向量。我想,随着不相交组数量的增加,这将在计算上很快变得非常昂贵 2) 我可以使用每个对象的标识符将它们分类为std::map的键,其中值是向量。此时,我所要做的就是在所有输入对象上迭代一次,每次调用myMap[object.identifier].pu

我试图将一个大型对象集合分类为一系列组,这些组代表了它们之间的某种共性

我似乎有两种方法可以做到这一点:

1) 我可以手工管理一切,把所有的对象分类成一个向量向量。然而,这意味着每当我想要为一个未分组的对象找到一个现有的组时,我必须迭代所有的上层向量。我想,随着不相交组数量的增加,这将在计算上很快变得非常昂贵

2) 我可以使用每个对象的标识符将它们分类为std::map的键,其中值是向量。此时,我所要做的就是在所有输入对象上迭代一次,每次调用myMap[object.identifier].push_(object)。映射将把所有内容排序到适当的向量中,然后我可以在之后迭代得到的值

我的问题是

哪种方法最好?看起来向量向量最初会更快,但随着越来越多的组被创建,它会变慢。AFAIK,std::map在内部使用RB树,这意味着找到合适的向量来添加对象应该会更快,但当树不可避免地需要重新平衡时,您将为此付出代价


std::map的额外内存消耗并不重要。我正在处理12000到80000个需要分组在一起的对象,我希望一旦一切都说了,就会有12000到20000个组。

我建议您评估
std::unordered_map
(文档)的使用,而不是直接使用您提到的任何一种方法对于您的用例。它在内部使用带有bucket和散列值的映射,并具有搜索、插入和删除的平均常量复杂性。

它们是不同的。对于向量解决方案,还需要注意删除重复项。但是,时间到了。看看吧。从性能上看,平面式结构最快,直到30-40件左右,无序的东西占据了主导地位。在任何情况下,RB树都不是最快的解决方案(平均情况)。这是我最喜欢的让软件运行更快的方法——如果不使用顺序,用无序的映射替换所有映射。你真的有性能问题吗?或者这只是一个一般性的考虑?在后一种情况下,我会投票支持实现最具可读性的解决方案,即最能反映您试图建模/模拟的内容的解决方案。考虑到访问接口,我(个人)更喜欢映射而不是向量。但是,特别是如果您的类别事先已知,您可以为它们使用枚举,并使用它通过索引访问预先分配的向量。