一、unique
注意:
unique
是移除连续的重复元素,不连续的不会移除,因此如果要移除所有重复元素需要先进行排序
对容器使用unique并不会使容器的元素个数减少,实际上容器的容量并没有改变,因此如果要移除容器中的连续重复元素需要配合std::erase
返回值是:指向容器新结尾的前向迭代器。
set只能插入不同的元素,因此set在某些时候可以替代unique
函数原型:
template <class ForwardIterator>
ForwardIterator unique(ForwardIterator first, ForwardIterator last);
template <class ForwardIterator, class BinaryPredicate>
ForwardIterator unique(ForwardIterator first, ForwardIterator last,BinaryPredicate pred);
实现:
template<class ForwardIt>
ForwardIt myunique(ForwardIt first, ForwardIt last)
{//思想:从旧的容器中拿元素放到新的容器,如果遇到相同的则跳过,继续去拿下一个,直到拿完旧容器。
if (first == last)
return last;
auto r = first;
while (++first != last) //first在这儿一定要先自增,因为last是容器的最后一个元素的迭代器加一
{
if (*first != *r) //不相同就把旧的赋值给新的
{
*(++r) = *first;
}
}
return ++r; //r如果不自增则指向的是去重后的最后一个元素(使用erase就需要先++)
}
使用示例
vector<int> vec1{ 2,3,3,3,4,2,3 };
vector<int> vec2{ 1,4,4,5,5,6,4,1,7 };
auto it1 = unique(vec1.begin(), vec1.end());//vec1:2,3,4,2,3,2,3 it1指向2
//移除两个连续元素和为10的第二个元素,例如6,4移除4,vec2:1,4,4,5,6,1,7,1,7 it2指向1
auto it2 = unique(vec2.begin(), vec2.end(), [=](int a, int b) {return a + b == 10; });
std::unique_copy
移除相邻重复元素,拷贝到新的容器
二、sort
注意:
默认使用升序
几个可能会用到的比较函数对象:
函数对象 | 描述 |
---|---|
equal_to | x == y |
not_equal_to | x != y |
greater | x > y |
less | x < y |
greater_equal | x >= y |
less_equal | x <= y |
示例:
vector<int> vec2{ 1,4,4,5,5,6,4,1,7 };
sort(vec2.begin(), end(vec2)); //默认升序 114445567
sort(vec2.begin(), vec2.end(), greater<int>()); //降序 765544411
sort(vec2.begin(), vec2.end(), less<int>()); //升序
sort(vec2.begin(), vec2.end(), [=](int a, int b) {return a > b; }); //降序
三、erase
注意:
<algorithm>没有erase函数,vector | map | list 各自erase的使用方法
删除去重后容器的末尾多余元素需要使用erase(first,last)
vector容器中的erase函数:
iterator erase (const_iterator position); //删除指定的一个元素
iterator erase (const_iterator first, const_iterator last); //删除区间所有元素