Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/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++ 是否有std::vector的后代可以合并和排序?_C++_Sorting_Merge_Stl_Stdvector - Fatal编程技术网

C++ 是否有std::vector的后代可以合并和排序?

C++ 是否有std::vector的后代可以合并和排序?,c++,sorting,merge,stl,stdvector,C++,Sorting,Merge,Stl,Stdvector,我正在为一个图形程序使用std::vectors。这些向量包含屏幕上的位置,并对其进行排序。现在,我想将它们合并在一起,并保留实际排序,同时删除可能的重复项,如下所示: vector1 : [2, 6, 10] vector2 : [1, 5, 6, 10] result : [1, 2, 5, 6, 10] 为了更好地理解这一点:我已经为自己编程了一个函数来进行实际的合并,它基于基本的std::vector函数,比如at、insert、size,但我相信我的函数在2上似乎存在性能差距 如果

我正在为一个图形程序使用std::vectors。这些向量包含屏幕上的位置,并对其进行排序。现在,我想将它们合并在一起,并保留实际排序,同时删除可能的重复项,如下所示:

vector1 : [2, 6, 10]
vector2 : [1, 5, 6, 10]
result  : [1, 2, 5, 6, 10]
为了更好地理解这一点:我已经为自己编程了一个函数来进行实际的合并,它基于基本的std::vector函数,比如at、insert、size,但我相信我的函数在2上似乎存在性能差距

如果可能的话,为了便于编程,我正在寻找其他std类std::vector后代,它们包含merge和sortkind=unique作为基本方法

有人知道STL中是否存在这样的类吗?

STL有容器和算法分离的概念,因此虽然std::vector确实没有成员对其进行排序或合并,但STL通过处理迭代器的非成员函数模板提供了所有必需的算法

例如,要对您要调用的向量进行排序

std::sort(vector1.begin(),vector1.end());
检查标题以获得进一步的参考,即std::sort和std::merge

要合并和删除重复项,可以使用std::set_union,这可能是最好的选择

是一个关于迭代器的教程,但是对于这个特定任务,您只需要自解释的vector::begin和vector::end

要从单个容器中删除重复项,通常使用std::unique或std::unique\u copy,如@unwind所述

std::unique和其他删除算法(如std::remove)有一个警告,它源于我提到的容器和算法的分离: 算法无法从容器中实际移除元素——它被赋予了一个迭代器或一个范围,但它不知道容器的实际类型和实现

因此,通常的方法是将要删除的元素移动到范围的末尾,然后将迭代器返回到这些元素中的第一个。然后您可以调用另一个函数来执行实际的删除操作,注意这次它将如何成为一个容器方法

这是如何使用std::unique完成的:


std::unique_copy不需要这个技巧,但它几乎会复制整个向量,因此只有在您打算复制它时,它才有意义。

错误的心态。STL算法是非成员函数模板。可能还应该说明删除重复的要求。独特?哦,对了,错过了那个部分。有趣的是,这实际上是复杂的事情,我从一开始就应该提到的是std::set_union。很容易忽略它——我想这个名字有点误导人。这是唯一合并的默认解决方案。您好,@Ap31,set_union确实是我要找的,我在cplusplus.com参考上找到了它,我已经测试过了,它工作得很好。也许最好是编辑您的第一个答案,就像最终的解决方案将出现在答案中一样,而不是下面的注释。@Dominique我编辑答案是为了添加对set_union的提及,您希望我删除整个std::unique部分吗?我仍然认为它有些关联。
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());