C++ 为什么可以';t[std::unique]是否适用于[std::multiset]? #包括 #包括 使用名称空间std; int main() { 多集coll{1,1,2}; 唯一(coll.begin(),coll.end());//错误 }

C++ 为什么可以';t[std::unique]是否适用于[std::multiset]? #包括 #包括 使用名称空间std; int main() { 多集coll{1,1,2}; 唯一(coll.begin(),coll.end());//错误 },c++,algorithm,stl,standards,C++,Algorithm,Stl,Standards,为什么不能将std::unique应用于std::multiset?因为移动赋值传递的范围[第一个,最后一个]中的元素(通过移位)发生了变化。这意味着它要求解引用迭代器的类型必须满足MoveAssignable的要求 类型要求 ForwardIt必须满足的要求 取消引用的转发类型必须满足的要求 但是的迭代器是常量迭代器(从C++11开始),不符合要求。不能通过它们移动分配延迟元素。std::multiset是内部排序的容器,std::unique正在更改容器中元素的位置。std::uniqu

为什么不能将
std::unique
应用于
std::multiset

因为移动赋值传递的范围[第一个,最后一个]中的元素(通过移位)发生了变化。这意味着它要求解引用迭代器的类型必须满足MoveAssignable的要求

类型要求

  • ForwardIt必须满足的要求
  • 取消引用的转发类型必须满足的要求

但是的迭代器是常量迭代器(从C++11开始),不符合要求。不能通过它们移动分配延迟元素。

std::multiset
是内部排序的容器,
std::unique
正在更改容器中元素的位置。
std::unique
在其实现中使用
container::iterator\u type
std::multiset
的结构是严格的,它只有
const\u iterator\u type
。因此
std::unique
不能应用于
std::multiset
类型


在引入c++11之前,
std::multimap
的内部结构可以更改,因此可以在这样的容器上应用
std::unique

不会从范围中删除重复的值,而是将它们移动到范围的末尾(通过交换输入序列中的两个元素)。在
std::multiset
和其他关联容器中,元素的顺序由排序谓词定义,用户无法更改。通过使
std::multiset
的非常量迭代器与其
const_迭代器类似,可以实现此限制(即,不能通过非常量迭代器修改
std::multiset
的元素).

我正在寻找,C++11之前的迭代器不是常量。这是如何工作的?@LogicStuff C++11之前的元素顺序可以更改,因此您可以应用
std::unique
@LogicStuff如果我的内存正确,C++11之前的标准对此不够清楚;有些实现允许,有些不允许。
#include <set>
#include <algorithm>

using namespace std;

int main()
{
        multiset<int> coll{ 1, 1, 2 };
        unique(coll.begin(), coll.end()); // error
}