#include <set>
#include <algorithm>
using namespace std;
int main()
{
multiset<int> coll{ 1, 1, 2 };
unique(coll.begin(), coll.end()); // error
}
爲什麼不能std::unique
適用於std::multiset
?爲什麼不能[std :: unique]適用於[std :: multiset]?
#include <set>
#include <algorithm>
using namespace std;
int main()
{
multiset<int> coll{ 1, 1, 2 };
unique(coll.begin(), coll.end()); // error
}
爲什麼不能std::unique
適用於std::multiset
?爲什麼不能[std :: unique]適用於[std :: multiset]?
由於std::unique改變(通過移動)的範圍是[第一,最後一個)的元件通過在由移動分配。這意味着它需要取消引用迭代器的類型必須滿足MoveAssignable的要求。
類型要求
- ForwardIt必須滿足ForwardIterator要求。
- 取消引用ForwardIt的類型必須符合MoveAssignable的要求。
但std::multiset迭代是常量迭代(因爲C++ 11),其不符合要求。引用的元素不能通過它們進行移動賦值。
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
應用於此類容器。
std::unique
不會刪除的範圍重複的值。相反,它將它們移動到範圍的末尾(通過交換輸入序列中的兩個元素)。在std::multiset
和其他關聯容器中,元素的順序由排序謂詞定義,並且不能由用戶修改。通過使std::multiset
的非常量迭代器與其const_iterator
有點相似(即,您無法通過其非常量迭代器修改std::multiset
的元素)來實現此限制。
我想找[這裏](http://en.cppreference.com/w/cpp/container/multiset)和前C++ 11'iterator'是不恆定的。這是如何工作的? – LogicStuff
@LogicStuff預C++ 11的元素的順序可以改變,因此,你可以申請'的std :: unique' – paweldac
@LogicStuff如果我的記憶是正確的,預C++ 11的標準不夠清晰有關;一些暗示允許它,有些則不允許。 – songyuanyao