C++ 用STL算法合并大量容器
我有很多列表,向量,集合。。。(无论您喜欢什么)指向特定类的名为C++ 用STL算法合并大量容器,c++,oop,stl,C++,Oop,Stl,我有很多列表,向量,集合。。。(无论您喜欢什么)指向特定类的名为realagebraicnumberpt的指针。它们被分类了 我想合并它们,当然我想快速高效地完成 最好的选择是什么标准::合并?或者可能是std::set?我可以提供
realagebraicnumberpt
的指针。它们被分类了
我想合并它们,当然我想快速高效地完成
最好的选择是什么<代码>标准::合并?或者可能是std::set
?我可以提供<和==排序
有什么想法吗?
std::merge
非常有效。您使用哪个底层容器取决于您的需求std::vector
的内存开销是所有标准容器中最小的,因此,如果您的数据很大,您应该坚持使用它
如果您使用
std::vector
,则在合并前应调整目标向量的大小,以避免重新分配(您应该能够提前计算所需的大小),而不是使用std::back\u插入器
std::merge
是最有效的方法。您使用哪个底层容器取决于您的需求std::vector
的内存开销是所有标准容器中最小的,因此,如果您的数据很大,您应该坚持使用它
如果您使用std::vector
,则在合并前应调整目标向量的大小,以避免重新分配(您应该能够预先计算所需的大小),而不是使用前面提到的std::back\u插入器
,std::merge
是可以的
仅对于std::list,您可以从std::list::merge
成员函数实现的优化中获益:它将列表节点从源节点拼接到目标节点。这样,源列表将变为空,但它将避免资源(重新)分配
回复:std::set
实际上,您可以将std::合并到一个std::集合中,以便一次性获得唯一的值。使用通用合并,重复值不会被过滤,但结果会被排序,因此您可以对结果应用std::unique
。如果您希望有很多重复项,那么使用std::set
可能会更快,正如前面提到的,std::merge
是可以的
仅对于std::list,您可以从std::list::merge
成员函数实现的优化中获益:它将列表节点从源节点拼接到目标节点。这样,源列表将变为空,但它将避免资源(重新)分配
回复:std::set
实际上,您可以将std::合并到一个std::集合中,以便一次性获得唯一的值。使用通用合并,重复值不会被过滤,但结果会被排序,因此您可以对结果应用std::unique
。如果您希望有很多重复项,那么使用std::set
std::merge
用于合并容器可能会更快。你会如何使用std::set
?我不知道。它的意思是xor;)@VJo:您可以将所有容器的内容插入一个集合
,最终得到一个有序的、合并的集合,其中没有重复项(或者如果改用multiset
,则有重复项)。但是,由于容器是从开始排序的,std::merge
将更有效。std::merge
用于合并容器。你会如何使用std::set
?我不知道。它的意思是xor;)@VJo:您可以将所有容器的内容插入一个集合
,最终得到一个有序的、合并的集合,其中没有重复项(或者如果改用multiset
,则有重复项)。但是,由于容器是从开始排序的,std::merge
将更有效。“std::vector的内存开销是所有标准容器中最小的”-尽管由于连续性要求,以及vector在重新分配时复制的事实,因此,当您使用大量可用内存时,std::vector
不是可以容纳大多数元素的容器。这取决于(虚拟)地址空间是否被分割以及向量的容量如何增长,deque
可能会获胜。@BjörnPollex建议resize
,而不是reserve
与std::back\u inserter
结合使用:两个世界的最佳选择:不太容易出错(例如,off-by-n保留大小)可忽略的性能差异“std::vector的内存开销是所有标准容器中最小的”-尽管由于连续性要求以及vector在重新分配时复制的事实,因此,当您使用大量可用内存时,std::vector
不是可以容纳大多数元素的容器。这取决于(虚拟)地址空间是否被分割以及向量的容量如何增长,deque
可能会获胜。@BjörnPollex建议resize
,而不是reserve
与std::back\u inserter
结合使用:两个世界的最佳选择:不太容易出错(例如,off-by-n保留大小)以及可忽略的性能差异