2016-09-30 89 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

相關問題