我正在使用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中是否存在这样的类吗?
答案 0 :(得分:4)
STL有容器和算法分离的概念,因此虽然std::vector
确实没有成员对它进行排序或合并,但STL通过非成员函数提供了所有必需的算法处理迭代器的模板。
E.g。对你要调用的矢量进行排序
std::sort(vector1.begin(),vector1.end());
检查algorithm标题以获取进一步的参考,即std::sort
和std::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
不需要这个技巧,但它几乎会复制整个矢量,所以只有你打算复制它才有意义。