Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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++ 用STL算法合并大量容器_C++_Oop_Stl - Fatal编程技术网

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保留大小)以及可忽略的性能差异