transform函数原型

1.

template<class _InIt,
class _OutIt,
class _Fn1> inline
_OutIt transform(_InIt _First, _InIt _Last,
_OutIt _Dest, _Fn1 _Func)
{ // transform [_First, _Last) with _Func
_DEPRECATE_UNCHECKED(transform, _Dest);
return (_Transform_no_deprecate(_First, _Last, _Dest, _Func));
}

2.

template<class _InIt1,
class _InIt2,
class _OutIt,
class _Fn2> inline
_OutIt transform(_InIt1 _First1, _InIt1 _Last1,
_InIt2 _First2, _OutIt _Dest, _Fn2 _Func)
{ // transform [_First1, _Last1) and [_First2, ...) with _Func
_DEFINE_DEPRECATE_UNCHECKED(transform);
_USE_DEPRECATE_UNCHECKED(_First2);
_USE_DEPRECATE_UNCHECKED(_Dest);
return (_Transform_no_deprecate(_First1, _Last1, _First2, _Dest, _Func));
}

3.

 #if _ITERATOR_DEBUG_ARRAY_OVERLOADS
template<class _InIt,
class _OutTy,
size_t _OutSize,
class _Fn1> inline
_OutTy *transform(_InIt _First, _InIt _Last,
_OutTy (&_Dest)[_OutSize], _Fn1 _Func)
{ // transform [_First, _Last) with _Func, array dest
return (_Unchecked(
_Transform_no_deprecate(_First, _Last,
_Array_iterator<_OutTy, _OutSize>(_Dest), _Func)));
}
#endif /* _ITERATOR_DEBUG_ARRAY_OVERLOADS */

4-6.

 #if _ITERATOR_DEBUG_ARRAY_OVERLOADS
template<class _InIt1,
class _InTy,
size_t _InSize,
class _OutIt,
class _Fn2> inline
_OutIt transform(_InIt1 _First1, _InIt1 _Last1,
_InTy (&_First2)[_InSize], _OutIt _Dest, _Fn2 _Func)
{ // transform [_First1, _Last1) and [_First2, ...), array input
_DEPRECATE_UNCHECKED(transform, _Dest);
return (_Transform_no_deprecate(_First1, _Last1,
_Array_iterator<_InTy, _InSize>(_First2), _Dest, _Func));
} template<class _InIt1,
class _InIt2,
class _OutTy,
size_t _OutSize,
class _Fn2> inline
_OutTy *transform(_InIt1 _First1, _InIt1 _Last1,
_InIt2 _First2, _OutTy (&_Dest)[_OutSize], _Fn2 _Func)
{ // transform [_First1, _Last1) and [_First2, ...), array dest
_DEPRECATE_UNCHECKED(transform, _First2);
return (_Unchecked(
_Transform_no_deprecate(_First1, _Last1,
_First2, _Array_iterator<_OutTy, _OutSize>(_Dest), _Func)));
} template<class _InIt1,
class _InTy,
size_t _InSize,
class _OutTy,
size_t _OutSize,
class _Fn2> inline
_OutTy *transform(_InIt1 _First1, _InIt1 _Last1,
_InTy (&_First2)[_InSize], _OutTy (&_Dest)[_OutSize], _Fn2 _Func)
{ // transform [_First1, _Last1) and [_First2, ...), array input/dest
return (_Unchecked(
_Transform_no_deprecate(_First1, _Last1,
_Array_iterator<_InTy, _InSize>(_First2),
_Array_iterator<_OutTy, _OutSize>(_Dest), _Func)));
}
#endif /* _ITERATOR_DEBUG_ARRAY_OVERLOADS */

暂时只研究前面2种

1.

#include <iostream>
#include<algorithm>
#include <functional>
#include <vector> using namespace std;
class Ticket
{
public:
Ticket()
{
;
}
int num;
int id;
char zimu;
};
class MyShow_transform
{
public:
Ticket* operator()(Ticket* t)
{
if (t->zimu == 'A')
{
cout << "车号:" << t->num << "座位:" << t->id << "排" << t->zimu << "座" << endl;
return t;
}
t->num = 0;
return t;
}
};
void show(Ticket* t)
{
if(t->num != 0)
cout<< t->num << "车" << t->id << "排" << t->zimu << "座" << endl;
return;
}
void test_transform()
{
vector<Ticket*> v1,v2,v3; for (int num = 0; num < 2; num++)
{
for (int id = 0; id < 5; id++)
{
for (int i = 0; i < 5; i++)
{
Ticket *tmp = new Ticket;
tmp->num = num+1;
tmp->id = id+1;
tmp->zimu = 'A' + i;
v1.push_back(tmp);
}
}
}
v2.resize(v1.size());
transform(v1.begin(), v1.end(), v2.begin(),MyShow_transform() );
cout << "-------------------------------------------------------------------" << endl;
for_each(v2.begin(), v2.end(), show);
for (vector<Ticket*>::iterator it = v1.begin(); it != v1.end(); )
{
delete (*it);
it = v1.erase(it);
it++;
}
}

增加函数适配器

#include <iostream>
#include<algorithm>
#include <functional>
#include <vector> using namespace std;
class Ticket
{
public:
Ticket()
{
;
}
int num;
int id;
char zimu;
};
class MyShow_transform : public std::binary_function<Ticket*, char, Ticket*>
{
public:
Ticket* operator()(const Ticket* t, const char c)const
{
Ticket* p = nullptr;
if (t->zimu == c)
{
cout << "车号:" << t->num << "座位:" << t->id << "排" << t->zimu << "座" << endl;
p = const_cast<Ticket *>(t);
return p;
}
if(p != nullptr)
p->num = 0;
return p;
}
};
void show(Ticket* t)
{
if (t == nullptr)
return;
if(t->num != 0)
cout<< t->num << "车" << t->id << "排" << t->zimu << "座" << endl;
return;
}
void test_transform()
{
vector<Ticket*> v1,v2,v3; for (int num = 0; num < 2; num++)
{
for (int id = 0; id < 5; id++)
{
for (int i = 0; i < 5; i++)
{
Ticket *tmp = new Ticket;
tmp->num = num+1;
tmp->id = id+1;
tmp->zimu = 'A' + i;
v1.push_back(tmp);
}
}
}
v2.resize(v1.size());
transform(v1.begin(), v1.end(), v2.begin(),bind2nd( MyShow_transform(),'A' ));
cout << "-------------------------------------------------------------------" << endl;
for_each(v2.begin(), v2.end(), show);
for (vector<Ticket*>::iterator it = v1.begin(); it != v1.end(); )
{
delete (*it);
it = v1.erase(it);
it++;
}
} void main()
{
test_transform();
cout << endl;
cout << "hello" << endl;
system("pause");
}

  

2.增加一个vector

#include <iostream>
#include<algorithm>
#include <functional>
#include <vector> using namespace std;
class Ticket
{
public:
Ticket()
{
;
}
int num;
int id;
char zimu;
};
class MyShow_transform : public std::binary_function<Ticket*, char, Ticket*>
{
public:
Ticket* operator()(const Ticket* t, const char c)const
{
Ticket* p = nullptr;
if (t->zimu == c)
{
cout << "车号:" << t->num << "座位:" << t->id << "排" << t->zimu << "座" << endl;
p = const_cast<Ticket *>(t);
return p;
}
if(p != nullptr)
p->num = 0;
return p;
}
};
class MyShow_transformadv : public std::binary_function<Ticket*, Ticket*, Ticket*>
{
public:
Ticket* operator()(const Ticket* t1, const Ticket* t2)const
{
Ticket* p = nullptr;
p = const_cast<Ticket *>(t1);
if (t2 == nullptr)
return p;
if (t1->num == t2->num)
{
cout << "车号:" << t1->num << "座位:" << t1->id << "排" << t1->zimu << "座" << endl;
return p;
}
if (p != nullptr)
p->num = 0;
return p;
}
};
void show(Ticket* t)
{
if (t == nullptr)
return;
if(t->num != 0)
cout<< t->num << "车" << t->id << "排" << t->zimu << "座" << endl;
return;
}
void test_transform()
{
vector<Ticket*> v1,v2,v3; for (int num = 0; num < 2; num++)
{
for (int id = 0; id < 5; id++)
{
for (int i = 0; i < 5; i++)
{
Ticket *tmp = new Ticket;
tmp->num = num+1;
tmp->id = id+1;
tmp->zimu = 'A' + i;
v1.push_back(tmp);
}
}
}
v2.resize(v1.size());
cout << "v2-------------------------------------------------------------------" << endl;
transform(v1.begin(), v1.end(), v2.begin(),bind2nd( MyShow_transform(),'A' ));
v3.resize(v1.size());
cout << "v3-------------------------------------------------------------------" << endl;
transform(v1.begin(), v1.end(), v2.begin(),v3.begin(), MyShow_transformadv());
cout << "-------------------------------------------------------------------" << endl; for (vector<Ticket*>::iterator it = v1.begin(); it != v1.end(); )
{
delete (*it);
it = v1.erase(it);
it++;
}
} void main()
{
test_transform();
cout << endl;
cout << "hello" << endl;
system("pause");
}

C++探究transform算法的更多相关文章

  1. C++探究foreach算法

    for_each在algorithm.h 中 template<class _InIt, class _Fn1> inline _Fn1 for_each(_InIt _First, _I ...

  2. A*寻路算法探究

    A*寻路算法探究 A*算法常用在游戏的寻路,是一种静态网路中求解最短路径的搜索方法,也是解决很多搜索问题的算法.相对于Dijkstra,BFS这些算法在复杂的搜索更有效率.本文在U3D中进行代码的测试 ...

  3. STL常用遍历算法for_each和transform的比较

    for_each()和transform()算法比较 1)STL 算法 – 修改性算法  for_each()  copy()  copy_backward()  transform()  merge ...

  4. STL经常使用遍历算法for_each和transform的比較

    for_each()和transform()算法比較 1)STL 算法 – 改动性算法  for_each()  copy()  copy_backward()  transform()  merge ...

  5. z-index和transform

    z-index和transform是CSS中的属性,但很少同学将二者联系到一起,感觉他们八杆子打不上.事实真的是这样吗?如果你也不能确认,这篇文章就值得你花点时间阅读.因为阅读完了,你会有所收获的. ...

  6. 4_STL设计理念_算法

    STL算法,容器,迭代器的设计理念1.STL容器通过 类模板 技术,实现 数据类型 和 容器模型的分离:2.迭代器技术 实现了 遍历和操作容器的统一方法3.STL算法设计理念:通过预定义的函数对象和函 ...

  7. 3_STL算法

    1.常用遍历算法1.1 for_each for_each(v1.begin(),v1.end(),show); void show(int &n) //回调函数的入口地址 { cout &l ...

  8. 关于统计变换(CT/MCT/RMCT)算法的学习和实现

    原文地址http://blog.sina.com.cn/s/blog_684c8d630100turx.html 刚开会每周的例会,最讨厌开会了,不过为了能顺利毕业,只能忍了.闲话不多说了,下面把上周 ...

  9. STL的容器算法迭代器的设计理念

    1) STL的容器通过类模板技术,实现数据类型和容器模型的分离. 2) STL的迭代器技术实现了遍历容器的统一方法:也为STL的算法提供了统一性. 3) STL的函数对象实现了自定义数据类型的算法运算 ...

随机推荐

  1. win7 80端口被iis占用

    下载iis管理器,打开,关闭80端口占用

  2. bresenham 算法生成直线

    struct Point{ Point() { posx = 0; posy = 0; } Point(int x, int y) { posx = x; posy = y; } int posx; ...

  3. springboot2.0动态多数据源切换

    摘要:springboot1.x到springboot2.0配置变化有一点变化,网上关于springboot2.0配置多数据源的资料也比较少,为了让大家配置多数据源从springboot1.x升级到s ...

  4. python大法好—模块 续

    1.sys模块 sys模块的常见函数列表 sys.argv: 实现从程序外部向程序传递参数. sys.exit([arg]): 程序中间的退出,arg=0为正常退出. sys.getdefaulten ...

  5. Linux网络编程学习(一) ----- 概论和Linux模型(第一章第二章)

    1.什么是计算机网络,通信方式是什么? 计算机网络就是通过通信线路相互连接的计算机的集合,主要通过双绞线.同轴电缆.电话线或者光缆等有形传输介质通信,还有就是通过激光.微波.卫星等实现无线通信 2.W ...

  6. uboot1.1.6

    http://blog.csdn.net/lizuobin2/article/details/52061530

  7. 安装SourceTree工具,无需注册就可以正常使用SourceTree

    1. 下载SourceTree安装包 2. 双击安装包进行安装,默认会直接安装在系统盘,此时桌面就会SourceTree的快捷键 3. 双击打开桌面的SourceTree,就会提示让你安装授权,那么接 ...

  8. C++ 设置光标问题

    一.隐藏光标 1.引入头文件window.h 2.  定义光标信息结构体变量 CONSOLE_CURSOR_INFO  cursor info={1,0}; typedef struct _CONSO ...

  9. echo不换行的实现

    1. echo的参数中, -e表示开启转义, /c表示不换行: echo -e "please input a value:/c" 2. -n不换行: echo -n " ...

  10. 从 ELK 到 EFK 的演进

    背景 作为中国最大的在线教育站点,目前沪江日志服务的用户包含网校,交易,金融,CCTalk 等多个部门的多个产品的日志搜索分析业务,每日产生的各类日志有好十几种,每天处理约10亿条(1TB)日志,热数 ...