常用的遍历算法
for_each
使用for_each需要引用头文件#include < algorithm >
普通遍历
class MyPrint
{
public:
void operator ()(int val)
{
cout << val << endl;
}
};
int main()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
for_each(v.begin(), v.end(), MyPrint());//这里使用仿函数
return 0;
}
绑定参数遍历
使用bind2nd()需要引用头文件#include< functional >
class MyPrint: public binary_function<int,int,void>
{
public:
void operator ()(int val,int val2) const
{
cout << val+val2 << endl;
}
};
int main()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
for_each(v.begin(), v.end(), bind2nd(MyPrint(),100));
return 0;
}
transform
是全局的,头文件是algorithm。transform算法将指定容器区间元素搬运到另一个容器中
transform(原容器的起始迭代器,原容器的结束迭代器,目标容器的起始迭代器,仿函数)
class MyTransform//这里的仿函数的返回值是int类型的,这样就可以在返回的时候对数字进行一些操作以后再放回新的容器。
{
public:
int operator()(int val)
{
return val+100;
}
};
int main()
{
vector<int> v;
for (int i = 0; i < 10; i++)
{
v.push_back(i);
}
vector<int> v2;
v2.resize(v.size());//这一步是必要的,不能将有容积的容器中的数据转移到没有容积的容器中
transform(v.begin(), v.end(), v2.begin(), MyTransform());//这里的仿函数与上面的不太一样
for_each(v2.begin(), v2.end(), [](int val) {cout << val << " "; });
return 0;
}