2016-08-04 43 views
2

我只是寫了這個代碼:合併兩個標準::設定的和(目前還沒有)的std ::設置::合併()

// Somewhere earlier, the equivalent of this happens. 
std::set<T> a; 
std::set<T> b; 
FillMeUp(a); 
FillMeUp(b); 

// Later, in another function that sees a and b, this happens. 
std::set<T> c; 
std::set_union(a.begin(), a.end(), 
       b.begin(), b.end(), 
       std::inserter(c, c.begin())); 
a.swap(c); 

的一點是,代碼的第二位,在某些情況下,想要將ab合併爲a。 (爲了動機:我有一個帶有集合的對象數組,我遍歷該數組,如果滿足某個條件,我所看到的對象基本上覆制了我之前看到的對象,所以我想將它的集合合併到之前的集合中)

C++ 17中有一個新函數叫做std::set::merge,但是我的g ++ 5.3.1顯然不知道它(說g ++ 5.3.1用-std調用= C++ 17)。

這個問題真的可以做得比我所做的更好嗎?

回答

4

正式地,std::set::mergedraft standard定義:

嘗試提取a2各自元件和將其插入用的該 比較對象。在具有唯一鍵的容器中,如果鍵中有一個 元素,其鍵值等於a2, 中元素的鍵,則該元素不會從a2中提取。

隨着複雜性:

N日誌(a.size()+ N),其中N的值是a2.size()。

由於這個的insert的一個重載的複雜程度相匹配:

template< class InputIt > 
void insert(InputIt first, InputIt last); 

這聽起來像的insert一個華而不實的包裝:

a.insert(b.begin(), b.end()); 
+3

這遠非「的'一個華而不實的包裝insert'」。 –

+0

我同意,而且比我寫的更清楚。我認爲在這個上下文中插入的唯一東西並不會做合併,而是插入將複製merge(iiuc)所做的動作,假設第二個容器的內容不再有效。 – jma

+0

如果通過「榮耀包裝」,你的意思是「不分配記憶」,那麼肯定。 –