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
}