2016-12-28 64 views

回答

6

由於std::unique改變(通過移動)的範圍是[第一,最後一個)的元件通過在由移動分配。這意味着它需要取消引用迭代器的類型必須滿足MoveAssignable的要求。

類型要求

std::multiset迭代是常量迭代(因爲C++ 11),其不符合要求。引用的元素不能通過它們進行移動賦值。

+0

我想找[這裏](http://en.cppreference.com/w/cpp/container/multiset)和前C++ 11'iterator'是不恆定的。這是如何工作的? – LogicStuff

+1

@LogicStuff預C++ 11的元素的順序可以改變,因此,你可以申請'的std :: unique' – paweldac

+0

@LogicStuff如果我的記憶是正確的,預C++ 11的標準不夠清晰有關;一些暗示允許它,有些則不允許。 – songyuanyao

2

std::multiset被internaly排序容器,std::unique正在改變元件possitions在容器中。 std::unique在其實現中使用container::iterator_type,並且由於std::multiset的結構嚴格,因此它只有const_iterator_type。因此std::unique不能應用於std::multiset類型。

在引入C++ 11之前,可以更改std::multimap的內部結構,因此可以將std::unique應用於此類容器。

2

std::unique不會刪除的範圍重複的值。相反,它將它們移動到範圍的末尾(通過交換輸入序列中的兩個元素)。在std::multiset和其他關聯容器中,元素的順序由排序謂詞定義,並且不能由用戶修改。通過使std::multiset的非常量迭代器與其const_iterator有點相似(即,您無法通過其非常量迭代器修改std::multiset的元素)來實現此限制。

相關問題