STL算法---生成和变异算法(遍历元素, 对元素做一些事情)

23 篇文章 0 订阅
13 篇文章 0 订阅
(遍历元素, 对元素做一些事情)

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. 注意函数对象的括号操作符的参数.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值