修正序列算法有可能会改变容器的内容,比如复制内容到容器中。下面来了解一下这类算法。
fill(start,end,i)
将start和end区间的元素改成i。
fill(v.begin(), v.end(), 20);
for_each(v.begin(), v.end(), outPut);
random_shuffle(start,end)
将区间内部的元素打乱。
random_shuffle(v.begin(), v.end());
for_each(v.begin(), v.end(), outPut);
partition(start,end,cut)
将容器切割开来,一部分包含谓词cut返回true的元素,另一部分包括谓词cut返回false的元素。迭代器返回两部分分界点的元素。
partition(v.begin(),v.end(),cut);
for_each(v.begin(), v.end(), outPut);
rotate(start,mid,end)
将mid到end之间的元素做旋转运算,放置到start开始的子序列中。
rotate(v.begin(), v.begin() + 4, v.end());
for_each(v.begin(), v.end(), outPut);
transform(start,end,result,func)
将指定范围中的元素执行到func定义的操作,并将返回值依次应用到result迭代器所属的容器内。代码来源于C++入门。
#include<iostream>
using namespace std;
#include<vector>
#include<string>
#include<algorithm>
class point
{
public:
point()
{
x = 0;
y = 0;
};
point(int x, int y)
{
this->x = x;
this->y = y;
}
void showPoint()
{
cout << "坐标是:("<< x << "," << y << ")" << endl;
}
private:
int x;
int y;
};
point Line(int x)
{
return point(x, x * x);
}
void test()
{
int array[] = { 1,2,3,4,5,6 };
vector<int>vint(array,array+6);
vector<point>vpoint;
vpoint.resize(6);
transform(vint.begin(), vint.end(), vpoint.begin(), Line);
for (vector<point>::iterator it = vpoint.begin(); it != vpoint.end(); it++)
{
it->showPoint();
}
}
int main()
{
test();
}
这一部分到此结束,希望对大家有所帮助!