C++知识点27——使用C++标准库(常用的泛型算法2)

接上一篇博客https://blog.csdn.net/Master_Cui/article/details/108404257

八、删除元素

template <class ForwardIterator, class T>
ForwardIterator remove (ForwardIterator first, ForwardIterator last, const T& val);

template <class ForwardIterator, class UnaryPredicate>
ForwardIterator remove_if (ForwardIterator first, ForwardIterator last, UnaryPredicate pred);

remove会移除迭代器区间中的与val相等的元素

remove_if会移除满足pred条件的元素

这两个函数的返回值是最后一个被删除元素的下一个元素的迭代器

示例与上一篇博客中的copy与copy_if,replace和replace_if类似

 

九、元素去重

template <class ForwardIterator>
ForwardIterator unique (ForwardIterator first, ForwardIterator last);

unique的意思是将迭代器区间内所有与前一元素相等的元素删除,也就是说如果对容器不排序,第一种形式只会对连续两个相同的元素去重

 

示例

void uniquetest()
{
	int a[]={1,1,2,3,2,4,5,6};
      cout<<sizeof(a)/sizeof(*a)<<endl;
	int *pos=unique(a, a+sizeof(a)/sizeof(*a));
      cout<<sizeof(a)/sizeof(*a)<<endl;
	for (int *pi=a;pi<pos;++pi) {
		cout<<*pi<<endl;
	}
}

注意:unique函数并不使数组或者容器的元素减少,去重时只是将元素迁移并覆盖,所以在打印去重的元素时,要利用unique的返回值进行遍历

 

示例2,对所有元素进行去重,使每个元素只出现一次

void uniquetest()
{
	int a[]={1,1,2,3,2,4,5,6};
	stable_sort(a, a+sizeof(a)/sizeof(*a));
	int *pos=unique(a, a+sizeof(a)/sizeof(*a));
	for (int *pi=a;pi<pos;++pi) {
		cout<<*pi<<endl;
	}
}

 

十、序列反转

template <class BidirectionalIterator>
void reverse (BidirectionalIterator first, BidirectionalIterator last);

将迭代器范围内的元素进行反转

 

示例

void reversetest()
{
	list<int> l={1,2,3,4,5};
	reverse(l.begin(), l.end());
	for (list<int>::iterator it = l.begin();it !=l.end();++it) {
		cout<<*it<<endl;
	}
}

和list自带的reverse操作类似

 

十一、序列合并

template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator merge (InputIterator1 first1, InputIterator1 last1,
                        InputIterator2 first2, InputIterator2 last2,
                        OutputIterator result);

merge函数将两个迭代器范围内的已排序元素合并到以result为起始地址的容器中(该容器必须有足够的空间容纳两个迭代器范围内的元素

 

示例

void mergetest()
{
	vector<int> a={4,5,1,2,3};
	deque<int> b={6,8,9,7,10};

	stable_sort(a.begin(), a.end());
	stable_sort(b.begin(), b.end());

	list<int> c(a.size()+b.size());
	merge(a.begin(), a.end(), b.begin(), b.end(), c.begin());
	for (list<int>::iterator it =c.begin();it!=c.end();++it) {
		cout<<*it<<endl;
	}
}

 

十二、序列赋值

template <class ForwardIterator, class T>
void fill (ForwardIterator first, ForwardIterator last, const T& val);

template <class OutputIterator, class Size, class T>
void fill_n (OutputIterator first, Size n, const T& val);

fill是用新的值val将迭代器范围内的元素重新赋值

fill_n是用新的值val将以迭代器first为起点的n个值重新赋值

 

示例和copy和replace类似

 

参考

《C++ Primer》

《C++标准库》

http://www.cplusplus.com/reference/algorithm/

https://zh.cppreference.com/w/cpp/algorithm

 

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值