2016-09-30 48 views
2

我正在为图形程序使用std :: vectors。这些向量包含屏幕上的位置,并对它们进行排序。现在我想将它们合并在一起,并保持实际排序,同时消除可能的重复,这样的事情:是否有可以合并和排序的std :: vector的后代?

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

对于一个很好的理解:我已编写自己的函数来完成实际的合并,基于基本的std ::载体功能,如at()insert()size(),但我的功能似乎是一个性能上的差距(O(N ),我相信)。

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

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

+1

错误的心态。STL算法是非成员函数模板。 –

回答

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()和其他“移除”像std::remove()算法,其从茎,我提到的“容器和算法的分离”: 一个算法没有手段来实际除去从容器元素 - 它被赋予了一个迭代器或一个范围,但它不知道容器的实际类型和实现。

因此,而不是常见的方法是正义之举旨在去除该范围的结束元素,然后迭代器返回到第一个这些元素。然后你可以调用另一个函数来做实际的移除(注意这个时候这将是一个容器方法)。

这是它是如何与std::unique()做到:

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

std::unique_copy不需要这一招,但它几乎复制整个矢量,所以它才有意义,如果你打算反正复制。

+1

也许应该说一些关于删除模糊的要求。 '的std ::唯一的()'? – unwind

+0

哦对,错过了那部分。有趣的是,这实际上是如何编写的东西 – Ap31

+0

@unwind fixed,thx。但是答案的大小增加了三倍:D – Ap31

相关问题