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

时间:2016-09-30 08:33:35

标签: c++ stl stdvector

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

@GET("getUser")
Call<Result>getUser(@Query("phoneNumber") String phoneNumber, @Query("hash") String hash)

为了更好地理解:我已经根据基本的std :: vector函数编写了自己的函数来进行实际的合并,例如vector1 : [2, 6, 10] vector2 : [1, 5, 6, 10] result : [1, 2, 5, 6, 10] at()insert(),但是我的功能似乎是一个性能差距(O(n 2 ),我相信)。

我正在寻找其他std类(如果可能的话,std :: vector后代,为了便于编程),其中包含size()merge()作为基本方法。

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

1 个答案:

答案 0 :(得分:4)

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

E.g。对你要调用的矢量进行排序

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

检查algorithm标题以获取进一步的参考,即std::sortstd::merge

要合并和删除重复项,您可以使用std::set_union,这可能是您最好的选择。 Here is working code example

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

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

std::unique()和其他&#34;删除&#34;有一个警告。像std::remove()这样的算法,源于容器和算法的分离&#34;我提到过: 算法无法从容器中实际删除元素 - 它已被赋予迭代器或范围,但它不知道容器的实际类型和实现。

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

这是std::unique()

的完成方式
vec.erase(std::unique(vec.begin(), vec.end()), vec.end());

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