2014-04-08 51 views
0

是否有一個有效的方法來轉換multiset設置,而不是循環multimap中的所有元素,測試如果設置了元素,如果是的話,插入如果不繼續?對於multiset和set,我更喜歡使用庫存C++容器,但其他語言實現也​​可以。有效的方法來轉換multiset設置

+0

爲什麼不插入所有元素? 'set'本身將防止重複,你不需要。除此之外,除非事先跟蹤重複,否則沒有更有效的方法來插入所有元素,而不是插入所有元素。 –

回答

2

std::set<T> new_set(multiset_obj.begin(), multiset_obj.end();應該這樣做。讓語言和容器要求成爲你的朋友。

2

您可以從現有的多集

template<typename T> 
set<T> SetFromMultiset(multiset<T> const &ms) 
{ 
    set<T> ret(ms.cbegin(), ms.cend()) 
    return ret; 
} 

我假設你正在使用C++ 11一組,所以沒有開銷的值返回一個容器,只有一個移動操作(甚至儘管這是RVO適用的情況)

0

我不確定以上答案是否最有效。

multiset中的項目是有序的,但set的構造函數可能不知道,並且會對每個插入項執行查找。

試試這個:

std::set<T> result; 
for (auto item: the_multiset) { 
    result.insert(result.end(), item); 
} 

但它仍然是不完美的,因爲它會走過所有重複值一個接一個,如果有大量重複值,它浪費時間。因爲它是一個多重集合,所以內部數據可以像map<key, count>,一樣,它應該允許開發人員直接轉到下一個不同的值。我希望這可以在將來的C++中發生。

相關問題