(遍历元素, 对元素做一些事情)
函数原形
template<class FwdIt, class T> void fill(FwdIt first, FwdIt last, const T& x);
函数原形
template<class OutIt, class Size, class T> void fill_n(OutIt first, Size n, const T& x);
函数原形
template<class InIt, class Fun> Fun for_each(InIt first, InIt last, Fun f);
1. 注意函数对象的括号操作符的参数.
2. 看代码MyObject1 aa = std::for_each(nV1.begin(), nV1.end(), MyObject1()); 在这个调用中MyObject1只构造了一次. 但是for_each的返回值是返回Fun, 这里不是很明白!
3. 从for_each的实现代码知道, 这里的Fun的返回值没有被使用.
函数原形
template<class FwdIt, class Gen> void generate(FwdIt first, FwdIt last, Gen g);
函数原形
template<class OutIt, class Pred, class Gen> void generate_n(OutIt first, Dist n, Gen g);
1. 注意函数对象的括号操作符的参数.
2. 区别for_each的函数对象.
3. 从generate的实现代码知道, Fun没有参数, 注意返回值的类型.
重载版本将操作作用在一对元素上,另外一个元素来自输入的另外一个序列。结果输出到指定容器
函数原形
template<class InIt, class OutIt, class Unop> OutIt transform(InIt first, InIt last, OutIt x, Unop uop);
template<class InIt1, class InIt2, class OutIt, class Binop> OutIt transform(InIt1 first1, InIt1 last1, InIt2 first2,OutIt x, Binop bop);
1. 注意函数对象的括号操作符的参数.
1. fill / fill_n
1.1 fill
将[first, last)中的元素赋值为x函数原形
template<class FwdIt, class T> void fill(FwdIt first, FwdIt last, const T& x);
1.2 fill_n
将输入值赋给first到first+n范围内的所有元素函数原形
template<class OutIt, class Size, class T> void fill_n(OutIt first, Size n, const T& x);
/
#include "stdafx.h"
#include <algorithm>
#include <numeric>
#include <functional>
#include <vector>
#include <iostream>
class MyObject1
{
public:
MyObject1(){}
~MyObject1(){}
// 括号操作符
bool operator()(int val1)
{
return (0 > val1);
}
};
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<int> nV2, nV1;
std::vector<int>::iterator iter;
nV1.clear();
nV1.push_back(12);
nV1.push_back(13);
nV1.push_back(14);
nV1.push_back(14);
nV1.push_back(50);
nV1.push_back(14);
nV1.push_back(23);
nV1.push_back(27);
nV1.push_back(28);
nV1.push_back(30);
nV1.push_back(34);
nV1.push_back(35);
nV1.push_back(37);
// 调用前nV1: 12, 13, 14, 14, 50, 14, 23, 27, 28, 30, 34, 35, 37
std::fill(nV1.begin(), nV1.end(), 88);
// 调用后nV1: 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88
nV1.clear();
nV1.push_back(12);
nV1.push_back(13);
nV1.push_back(14);
nV1.push_back(14);
nV1.push_back(50);
nV1.push_back(14);
nV1.push_back(23);
nV1.push_back(27);
nV1.push_back(28);
nV1.push_back(30);
nV1.push_back(34);
nV1.push_back(35);
nV1.push_back(37);
nV2.resize(nV1.size());
// 调用前nV1: 12, 13, 14, 14, 50, 14, 23, 27, 28, 30, 34, 35, 37
std::fill_n(nV1.begin(), 5, 88);
// 调用前nV1: 88, 88, 88, 88, 88, 14, 23, 27, 28, 30, 34, 35, 37
return 0;
}
2. for_each
用指定函数依次对指定范围内所有元素进行迭代访问,返回所指定的函数类型。该函数不得修改序列中的元素函数原形
template<class InIt, class Fun> Fun for_each(InIt first, InIt last, Fun f);
/
#include "stdafx.h"
#include <algorithm>
#include <numeric>
#include <functional>
#include <vector>
#include <iostream>
class MyObject1
{
public:
MyObject1(){}
~MyObject1(){}
// 括号操作符
void operator()(int& val1)
{
++val1;
}
};
void Fun(int& val1)
{
++val1;
}
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<int> nV2, nV1;
std::vector<int>::iterator iter;
nV1.clear();
nV1.push_back(12);
nV1.push_back(13);
nV1.push_back(14);
nV1.push_back(14);
nV1.push_back(50);
nV1.push_back(14);
nV1.push_back(23);
nV1.push_back(27);
nV1.push_back(28);
nV1.push_back(30);
nV1.push_back(34);
nV1.push_back(35);
nV1.push_back(37);
// 调用前nV1: 12, 13, 14, 14, 50, 14, 23, 27, 28, 30, 34, 35, 37
MyObject1 aa = std::for_each(nV1.begin(), nV1.end(), MyObject1());
// 调用后nV1: 13, 14, 15, 15, 51, 15, 24, 28, 29, 31, 35, 36, 38
nV1.clear();
nV1.push_back(12);
nV1.push_back(13);
nV1.push_back(14);
nV1.push_back(14);
nV1.push_back(50);
nV1.push_back(14);
nV1.push_back(23);
nV1.push_back(27);
nV1.push_back(28);
nV1.push_back(30);
nV1.push_back(34);
nV1.push_back(35);
nV1.push_back(37);
// 调用前nV1: 12, 13, 14, 14, 50, 14, 23, 27, 28, 30, 34, 35, 37
std::for_each(nV1.begin(), nV1.end(), Fun);
// 调用后nV1: 13, 14, 15, 15, 51, 15, 24, 28, 29, 31, 35, 36, 38
return 0;
}
说明:
1. 注意函数对象的括号操作符的参数.
2. 看代码MyObject1 aa = std::for_each(nV1.begin(), nV1.end(), MyObject1()); 在这个调用中MyObject1只构造了一次. 但是for_each的返回值是返回Fun, 这里不是很明白!
3. 从for_each的实现代码知道, 这里的Fun的返回值没有被使用.
3. generate / generate_n
3.1 generate
连续调用输入的函数来填充指定的范围函数原形
template<class FwdIt, class Gen> void generate(FwdIt first, FwdIt last, Gen g);
3.2 generate_n
与generate函数类似,填充从指定iterator开始的n个元素函数原形
template<class OutIt, class Pred, class Gen> void generate_n(OutIt first, Dist n, Gen g);
/
#include "stdafx.h"
#include <algorithm>
#include <numeric>
#include <functional>
#include <vector>
#include <iostream>
class MyObject1
{
public:
MyObject1()
{
int i = 9;
}
~MyObject1(){}
// 括号操作符
int operator()()
{
return 90;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<int> nV2, nV1;
std::vector<int>::iterator iter;
nV1.clear();
nV1.push_back(12);
nV1.push_back(13);
nV1.push_back(14);
nV1.push_back(14);
nV1.push_back(50);
nV1.push_back(14);
nV1.push_back(23);
nV1.push_back(27);
nV1.push_back(28);
nV1.push_back(30);
nV1.push_back(34);
nV1.push_back(35);
nV1.push_back(37);
// 调用前nV1: 12, 13, 14, 14, 50, 14, 23, 27, 28, 30, 34, 35, 37
std::generate(nV1.begin(), nV1.end(), MyObject1());
// 调用后nV1: 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90
return 0;
}
说明:
1. 注意函数对象的括号操作符的参数.
2. 区别for_each的函数对象.
3. 从generate的实现代码知道, Fun没有参数, 注意返回值的类型.
4. transform
将输入的操作作用与指定范围内的每个元素,并产生一个新的序列。重载版本将操作作用在一对元素上,另外一个元素来自输入的另外一个序列。结果输出到指定容器
函数原形
template<class InIt, class OutIt, class Unop> OutIt transform(InIt first, InIt last, OutIt x, Unop uop);
template<class InIt1, class InIt2, class OutIt, class Binop> OutIt transform(InIt1 first1, InIt1 last1, InIt2 first2,OutIt x, Binop bop);
/
#include "stdafx.h"
#include <algorithm>
#include <numeric>
#include <functional>
#include <vector>
#include <iostream>
class MyObject1
{
public:
MyObject1(){}
~MyObject1(){}
// 括号操作符
int operator()(int& val)
{
return 2 * val;
}
};
class MyObject2
{
public:
MyObject2(){}
~MyObject2(){}
// 括号操作符
int operator()(int& val1, int& val2)
{
return val1 + val2;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<int> nV2, nV1, nV3;
std::vector<int>::iterator iter;
nV1.clear();
nV1.push_back(12);
nV1.push_back(13);
nV1.push_back(14);
nV1.push_back(14);
nV1.push_back(50);
nV1.push_back(14);
nV1.push_back(23);
nV1.push_back(27);
nV1.push_back(28);
nV1.push_back(30);
nV1.push_back(34);
nV1.push_back(35);
nV1.push_back(37);
nV2.resize(nV1.size());
// 调用前nV1: 12, 13, 14, 14, 50, 14, 23, 27, 28, 30, 34, 35, 37
iter = std::transform(nV1.begin(), nV1.end(), nV2.begin(), MyObject1());
// 调用后nV1: 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, end(iter)
nV1.clear();
nV1.push_back(12);
nV1.push_back(13);
nV1.push_back(14);
nV1.push_back(14);
nV1.push_back(50);
nV2.clear();
nV2.push_back(14);
nV2.push_back(23);
nV2.push_back(27);
nV2.push_back(28);
nV2.push_back(30);
nV2.push_back(34);
nV2.push_back(35);
nV2.push_back(37);
nV3.resize(nV1.size());
// 调用前nV1: 12, 13, 14, 14, 50
// 调用前nV2: 14, 23, 27, 28, 30, 34, 35, 37
iter = std::transform(nV1.begin(), nV1.end(), nV2.begin(), nV3.begin(), MyObject2());
// 调用后nV3: 26, 36, 41, 42, 80, end(iter)
return 0;
}
说明:
1. 注意函数对象的括号操作符的参数.