std::unique,std::sort,std::erase

中文标准库:std::unique

中文标准库:std::sort

中文标准库:std::erase

一、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);  //删除区间所有元素
posted @ 2021-06-24 16:53  滴哒哒哒  阅读(188)  评论(0编辑  收藏  举报