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

Are there descendants of std::vector who can merge and sort?

本文关键字:合并 排序 后代 std vector 是否      更新时间:2023-10-16

我正在使用std::vectors的图形程序。这些向量包含屏幕上的位置,并且它们是排序的。现在我想把它们合并在一起,保持实际的排序,同时删除可能的重复,像这样:

vector1 : [2, 6, 10]
vector2 : [1, 5, 6, 10]
result  : [1, 2, 5, 6, 10]

为了更好的理解:我已经自己编程了函数来做实际的合并,基于基本的std::向量函数,如at(), insert(), size(),但我的函数似乎是一个性能差距(O(n2),我相信)。

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

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

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

。要对向量进行排序,可以调用

std::sort(vector1.begin(),vector1.end());

检查算法头供进一步参考,即std::sortstd::merge

要合并和删除重复项,您可以使用std::set_union,这可能是您最好的选择。下面是工作代码示例。

这是一个关于迭代器的教程,不过对于这个特定的任务,您只需要不言自明的vector::begin()vector::end()

要从单个容器中删除重复项,通常使用std::unique()std::unique_copy(),如@unwind所提到的。

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

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

std::unique():

vec.erase(std::unique(vec.begin(), vec.end()), vec.end());

std::unique_copy不需要这个技巧,但它会复制整个向量,所以只有当你打算复制它时才有意义。