为什么不能[std :: unique]适用于[std :: multiset]?

时间:2016-12-28 10:20:16

标签: c++ algorithm stl standards

#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">

3 个答案:

答案 0 :(得分:6)

因为std::unique改变(通过移动)移动赋值传入的[first,last]范围内的元素。这意味着它需要取消引用迭代器的类型必须满足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的元素)。