#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
适用于$('#btn_hide').click(function(){
var status = 0;
$('.xyz').each(function(){
if($(this).is(":visible")){
alert('Do not hide abc');
status = 0;
} else
{
status = 1;
}
})
if(status == 1){
$('.abc').hide();
} else
{
$('.abc').show();
}
})
<div class="abc">asdas
<div class="xyz" style="display: none;">{.......}</div>
<div class="xyz" style="display: none;">{.......}</div>
<div class="xyz" style="display: none;">{.......}</div>
<div class="xyz" style="display: none;">{.......}</div>
<div class="xyz" style="display: none;">{.......}</div>
</div>
<input type="button" id="btn_hide" value="Hide">
?
答案 0 :(得分:6)
因为std::unique改变(通过移动)移动赋值传入的[first,last]范围内的元素。这意味着它需要取消引用迭代器的类型必须满足MoveAssignable的要求。
类型要求
- ForwardIt必须符合ForwardIterator的要求。
- 取消引用的ForwardIt类型必须符合MoveAssignable的要求。
但是std::multiset的迭代器是const迭代器(因为C ++ 11),它不符合要求。引用的元素不能通过它们移动分配。
答案 1 :(得分:3)
std::multiset
是内部排序的容器,std::unique
正在更改容器中的元素。 std::unique
在其实施中使用了container::iterator_type
,并且由于std::multiset
的结构严格,因此它只有const_iterator_type
。因此,std::unique
类型无法应用std::multiset
。
在引入c ++ 11之前,可以更改std::multimap
的内部结构,因此std::unique
可以应用于此类容器。
答案 2 :(得分:2)
std::unique
无法从范围中删除重复值。相反,它将它们移动到范围的末尾(通过交换输入序列中的两个元素)。在std::multiset
和其他关联容器中,元素的顺序由排序谓词定义,并且不能由用户更改。这个限制是通过使std::multiset
的非常量迭代器有点类似于它的const_iterator
来实现的(即你不能通过它的非常量迭代器来修改std::multiset
的元素)。