接上一篇博客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相等的元素
示例与上一篇博客中的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
欢迎大家评论交流,作者水平有限,如有错误,欢迎指出