当前位置: 首页 > news >正文

(6)STL算法之转换

2、转换

函数transform()实现了将源区间的元素复制到目标区间,也可以修改元素、合并两个区间。

//对源区间 [first1,last1]的每一个元素均调用函数 op(elem) ,结果写入以result为起始位置的目标区间,函数返回值是最后一个被转换元素的下一位置。 
template <class InputIterator, class OutputIterator, class UnaryOperation>
OutputIterator transform (InputIterator first1, InputIterator last1,OutputIterator result, UnaryOperation op);

//对源区间 [first1,last1]的每一个元素,和first2开始的第二个源区间的对应元素调用函数或者规则 op(elem1,elem2) ,结果写入以result为起始位置的目标区间,函数返回值是最后一个被转换元素的下一位置。    需要注意的是第二源区间需要有足够的空间,至少和第一源区间一样大 

template <class InputIterator1, class InputIterator2,class OutputIterator, class BinaryOperation>
OutputIterator transform (InputIterator1 first1, InputIterator1 last1,InputIterator2 first2, OutputIterator result,BinaryOperation binary_op);


template <class InputIterator, class OutputIterator, class UnaryOperator>
OutputIterator transform (InputIterator first1, InputIterator last1,OutputIterator result, UnaryOperator op)
{
    while (first1 != last1) 
    {
        *result = op(*first1);  // or:  *result=binary_op(*first1,*first2++);
        ++result; 
        ++first1;
    }
    return result;
}


// 对于以上两种,都需要目标区间有足够空间,否则就需要使用  插入行迭代器

对于以上两种形式,都需要目标区间有足够空间,否则就需要使用  插入行迭代器。

用法示例:

#include <iostream> 
#include <vector>
#include <list>
#include <algorithm>
#include <functional>
#include <iterator>
using namespace std;

void print(int& Ele)
{
	cout << Ele << ", ";
}
void main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	vector<int> v1;
	list<int>l2, l3;

	v1.assign(arr, arr + 9);
	cout << "vector v1: ";
	for_each(v1.begin(), v1.end(), print);
	cout << endl;

	//l2中的元素分别取反(negate),以下用到了许多仿函数
	transform(v1.begin(), v1.end(), back_inserter(l2), negate<int>());
	cout << "list l2*(-1): ";
	for_each(l2.begin(), l2.end(), print);
	cout << endl;

	//l2中的元素分别乘(multiplies)以10
	transform(l2.begin(), l2.end(), l2.begin(), bind2nd(multiplies<int>(), 10));
	cout << "list l2(*10): ";
	for_each(l2.begin(), l2.end(), print);
	cout << endl;

	cout << "list l2(-): ";// 逆序并取反(negate)
	transform(l2.rbegin(), l2.rend(), ostream_iterator<int>(cout, ", "), negate<int>()); 
	cout << endl;

	cout << "list l2(/2, reverse_direction): ";//  除(divide)
	transform(l2.rbegin(), l2.rend(), ostream_iterator<int>(cout, ", "), bind2nd(divides<int>(), 2));
	cout << endl;
	//以上是第一种形式的用法

	cout << "list l2: ";
	for_each(l2.begin(), l2.end(), print);
	cout << endl;

	cout << "list l2(*v1): ";
	transform(v1.begin(), v1.end(), l2.begin(), l2.begin(), multiplies<int>());
	copy(l2.begin(), l2.end(), ostream_iterator<int>(cout, ", "));
	cout << endl;

	cout << "list l2(squared): ";
	//l2中的元素没有变化
	transform(l2.begin(), l2.end(), l2.begin(), ostream_iterator<int>(cout, ", "), multiplies<int>());
	cout << endl;

	cout << "list l2: ";
	for_each(l2.begin(), l2.end(), print);
	cout << endl;

	cout << "l3( v1+l2 ): ";
	transform(v1.begin(), v1.end(), l2.begin(), back_inserter(l3), plus<int>());
	for_each(l3.begin(), l3.end(), print);
	cout << endl;

	cout << "cout (l2-l3) : ";
	//l2、l3中的元素没有变化
	transform(l2.begin(), l2.end(), l3.begin(), ostream_iterator<int>(cout, ", "), minus<int>());
	cout << endl;
}

 

相关文章:

  • (7)STL算法之交换赋值
  • 菱形继承问题
  • 改善程序与设计的N个做法
  • C++数据结构之顺序表
  • C++数据结构之单链表
  • (8)STL算法之替换
  • (9)STL算法之逆转旋转
  • NFS安装使用
  • STL之map(关联式容器)
  • STL之unordered_map
  • 动态规划
  • 算法分析
  • 编写一个函数,实现将char类型的字符串,循环右移n个位置
  • 类构造、析构、赋值函数示例
  • 数组指针指针数组
  • Git的一些常用操作
  • Laravel 菜鸟晋级之路
  • PAT A1017 优先队列
  • Python打包系统简单入门
  • Spark学习笔记之相关记录
  • 高性能JavaScript阅读简记(三)
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 关于springcloud Gateway中的限流
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 自制字幕遮挡器
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 第二十章:异步和文件I/O.(二十三)
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​香农与信息论三大定律
  • #{} 和 ${}区别
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (第二周)效能测试
  • (转)Oracle存储过程编写经验和优化措施
  • (转)创业的注意事项
  • (转)关于pipe()的详细解析
  • .jks文件(JAVA KeyStore)
  • .NET 8.0 中有哪些新的变化?
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .Net Remoting常用部署结构
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • []FET-430SIM508 研究日志 11.3.31
  • [ARM]ldr 和 adr 伪指令的区别
  • [BZOJ 3282] Tree 【LCT】
  • [Codeforces] probabilities (R1600) Part.1
  • [CSS] 点击事件触发的动画
  • [Java]深入剖析常见排序
  • [JavaEE系列] wait(等待) 和 notify(唤醒)
  • [LeetCode 127] - 单词梯(Word Ladder)