C++常用算法–遍历
包括for_each和transform
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
void PrintInfo(int num)
{
std::cout << num << " ";
}
class Person
{
public:
int age_;
std::string name_;
Person(std::string name,int age)
{
this->age_ = age;
this->name_ = name;
}
Person(){}
};
void PrintPerson(Person p)
{
std::cout << p.name_ << ":" << p.age_ << std::endl;
}
// 1、for_each 功能是遍历容器
void test1()
{
// int类型
std::vector<int> numList;
for (int i = 0; i < 10; i++)
{
numList.push_back(i);
}
for_each(numList.begin(), numList.end(), PrintInfo);
std::cout << std::endl;
// 自定义类型
std::vector<Person> personList;
Person p1("pcy", 25); personList.push_back(p1);
Person p2("ncs", 27); personList.push_back(p2);
Person p3("zyy", 21); personList.push_back(p3);
for_each(personList.begin(), personList.end(), PrintPerson);
std::cout << "----------------------\n";
for_each(personList.begin(), personList.begin()+2, PrintPerson);
}
// 2、transform,搬运容器到另一个容器
class Transform
{
public:
int operator()(int val)
{
return val+100;
}
};
int TransNum(int val)
{
return val + 10;
}
Person TransPerson(Person p)
{
p.age_ += 100;
return p;
}
void TestTransform()
{
// 搬运的目标容器必须要提前开辟空间,否则无法正常搬运
// int类型
std::vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
std::vector<int> vTarget;
vTarget.resize(v.size()); // 目标容器需要提前开辟空间
// 原容器开始迭代器、原容器结束迭代器、目标容器开始迭代器、函数对象
transform(v.begin(),v.end(),vTarget.begin(),Transform());
for_each(vTarget.begin(), vTarget.end(), PrintInfo);
std::cout << std::endl;
std::vector<int> vTarget2;
vTarget2.resize(v.size());
// 原容器开始迭代器、原容器结束迭代器、目标容器开始迭代器、_func函数
transform(v.begin(), v.end(), vTarget2.begin(), TransNum);
for_each(vTarget2.begin(), vTarget2.end(), PrintInfo);
std::cout << std::endl;
// 自定义类型
std::vector<Person> personList;
Person p1("pcy", 25); personList.push_back(p1);
Person p2("ncs", 27); personList.push_back(p2);
Person p3("zyy", 21); personList.push_back(p3);
// resize 函数会直接修改容器的大小,并且如果新的大小比当前大小大,会插入默认构造的元素
// 因此需定义默认构造函数
// 和copy相比,transform在进行转移时可以进行一步操作,而copy只是简单的复制
std::vector<Person> vTarget3;
vTarget3.resize(personList.size());
// 原容器开始迭代器、原容器结束迭代器、目标容器开始迭代器、_func函数
transform(personList.begin(), personList.end(), vTarget3.begin(), TransPerson);
for_each(vTarget3.begin(), vTarget3.end(), PrintPerson);
std::cout << std::endl;
}
int main()
{
//test1();
TestTransform();
}