for_each
//遍历容器transform
//搬运容器到另一个容器中功能描述:
函数原型:
for_each(iterator beg, iterator end, _func);
// 遍历算法 遍历容器元素
beg //开始迭代器
end //结束迭代器
_func //普通函数名或者函数对象
底层原理如下:
#include
using namespace std;
#include
#include
#include
// 提供一个普通函数
void Mypirnt1(int a) {
cout << a << " ";
}
// 提供一个仿函数
class Myprint2 {
public:
void operator()(int a) {
cout << a << " ";
}
};
// 常用遍历算法:for_each
void test01() {
vector v1;
v1.push_back(10);
v1.push_back(201);
v1.push_back(3);
v1.push_back(6);
v1.push_back(58);
v1.push_back(79);
cout << "用for_each函数遍历v1里的元素如下:" << endl;
// for_each第三个参数用普通函数
for_each(v1.begin(), v1.end(), Mypirnt1);
cout << endl << endl;
cout << "用for_each函数遍历v1里的元素如下:" << endl;
// 第三个参数用仿函数
for_each(v1.begin(), v1.end(),Myprint2());
cout << endl << endl;
}
int main() {
test01();
return 0;
}
总结 :for_each在实际开发中是最常用遍历算法,需要熟练掌握
第三个参数如果传的是普通函数,直接写个函数名就可以不需要带()
如果穿的是函数对象,那么就传一个匿名对象
// 普通函数直接写函数名
for_each(v1.begin(), v1.end(), Mypirnt1);
// 函数对象的话传一个匿名对象
for_each(v1.begin(), v1.end(),Myprint2());
功能描述:
函数原型:
transform(iterator beg1, iterator end1, iterator beg2, _func);
//beg1 源容器开始迭代器
//end1 源容器结束迭代器
//beg2 目标容器开始迭代器
//_func 函数或者函数对象。在搬运过程中想对这些数据做什么操作
底层源码如下:
#include
using namespace std;
#include
#include
#include
class Mytransform1 {
public:
// 如果不想在搬运过程中做任何运算的话
// 就像下面这么写
int operator()(int a) {
return a;
}
};
class Mytransform2 {
public:
// 搬运过程中,给搬运的元素每个加上1000
int operator()(int a) {
return a + 1000;
}
};
class Myprint1 {
public:
void operator()(int a) {
cout << a << " ";
}
};
// 搬运函数:transform
void test01() {
// 源容器
vector v1;
v1.push_back(10);
v1.push_back(201);
v1.push_back(3);
v1.push_back(6);
v1.push_back(58);
v1.push_back(79);
// 目标容器
vector v2;
// 搬运之前一定得干一件事,给v2容器开辟一段空间
// 不写这段话的话会崩溃
// 怎么能把一个容器里的数据搬运到一段没有开辟的内存空间中呢?
v2.resize(v1.size());
transform(v1.begin(), v1.end()-2, v2.begin(), Mytransform1());
cout << "搬运前v1里的元素如下:" << endl;
for_each(v1.begin(), v1.end(), Myprint1());
cout << endl << endl;
cout << "[把v1.begin(),v1.end()-2)区间里的元素搬运到v2中" << endl;
cout << "v2里的元素如下:" << endl;
for_each(v2.begin(), v2.end(), Myprint1());
cout << endl << endl;
cout << "搬运后v1里的元素如下:" << endl;
for_each(v1.begin(), v1.end(), Myprint1());
cout << endl << endl;
vector v3;
v3.resize(v1.size());
transform(v1.begin(), v1.end() - 2, v3.begin(), Mytransform2());
cout << "[把v1.begin(),v1.end()-2)区间里的元素搬运到v3中,搬运过程中给每个元素+1000" << endl;
cout << "v3里的元素如下:" << endl;
for_each(v3.begin(), v3.end(), Myprint1());
cout << endl << endl;
cout << "v1里的元素如下:" << endl;
for_each(v1.begin(), v1.end(), Myprint1());
cout << endl << endl;
}
int main() {
test01();
return 0;
}