本篇接着前面stl变易算法(一)和stl变易算法(二)继续讲述变易算法。这里将介绍完余下的变易算法,主要有:填充fill、n次填充fill_n、随机生成元素generate、随机生成n个元素generate_n、移除复制remove_copy、条件移除复制remove_copy_if、移除remove、条件移除remove_if、不连续重复元素复制unique_copy、剔除连续重复元素unique、元素反向reverse、反向复制reverse_copy及旋转rotate 。给出算法实现及实例。
填充fill
fill算法将同一个值填充到容器的一个或多个元素处,使用原型如下,将元素区间[first,last)上的元素全部填充为value值。
//fill算法函数的代码
template <class ForwardIterator, class T>
void fill (ForwardIterator first, ForwardIterator last, const T& val)
{
while (first != last) {
*first = val;
++first;
}
}
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
void print(int x){
cout << x << ' ';
}
int main(void){
vector<int> v(5);
fill(v.begin(), v.end(), 30);
for_each(v.begin(), v.end(), print);
cout << endl;
return 0;
}
n次填充fill_n
类似于fill算法,fill_n算法可指定填充的元素个数。它的使用原型如下,将迭代器区间[first,first+n)个元素的值填充为value新值。
//fill_n函数的代码
template <class OutputIterator, class Size, class T>
OutputIterator fill_n (OutputIterator first, Size n, const T& val)
{
while (n>0) {
*first = val;
++first; --n;
}
return first; // since C++11
}
//测试用例
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
void print(int x){
cout << x << ' ';
}
int main(void){
vector<int> v(8);
fill(v.begin(), v.end(), 1);
//前5个元素填充为2
fill_n(v.begin(), 5, 2);
for_each(v.begin(), v.end(), print);
cout << endl;
//全部填充为3
fill_n(v.begin(), v.size(), 3);
for_each(v.begin(), v.end(), print);
cout << endl;
return 0;
}
随机生成元素generate
generate算法为容器生成新元素,使用原型如下,将gen发生器生成的一系列元素存入迭代器区间[first,last)的元素区域处。
//generate算法函数代码
template <class ForwardIterator, class Generator>
void generate ( ForwardIterator first, ForwardIterator last, Generator gen )
{
while (first != last) {
*first = gen();
++first;
}
}
//测试用例
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
//等差数列an+1=an + 3
class sequence{
public:
int a;
sequence(){a=0;}
inline int operator()(){
a=a + 3;
return a;
}
};
void print(int x){
cout << x << endl;
}
int main(void){
vector<int> v(10);
sequence an;
generate(v.begin(), v.end(), an);
for_each(v.begin(), v.end(), print);
cout << endl;
return 0;
}
随机生成n个元素generate_n
与generate算法类似,但generate_n算法限定了可填入容器的数值个数。它的使用原型如下,将迭代器区间[first,first+n)位置处的n个元素,填入由发生器gen生成的数值。
//generate_n算法函数代码