首先更正对unique的错误认知
unique
函数并不是将所有的重复元素都挪到容器最后。
unique
源码
版本一:
template<class ForwardIt>
ForwardIt unique(ForwardIt first, ForwardIt last)
{
if (first == last)
return last;
ForwardIt result = first;
while (++first != last)
if (!(*result == *first) && ++result != first)
*result = std::move(*first);
return ++result;
}
版本二:
template<class ForwardIt, class BinaryPredicate>
ForwardIt unique(ForwardIt first, ForwardIt last, BinaryPredicate p)
{
if (first == last)
return last;
ForwardIt result = first;
while (++first != last)
if (!p(*result, *first) && ++result != first)
*result = std::move(*first);
return ++result;
}
版本二比版本一多一个参数,这个参数是可调用对象,可用于判断自定义类型是否相等,其他无差别。
分析源码就能知道,unique
函数从前往后扫描容器,如果发现了两个重复的元素A、B,A、B的值都一样,就立即用AB后面紧接着的一个元素C覆盖B,以此类推,直至扫描完整个容器。