雁过无痕
C++博客
::
首页
::
新随笔
::
联系
::
聚合
::
管理
::
<
2011年3月
>
日
一
二
三
四
五
六
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
留言簿
(7)
给我留言
查看公开留言
查看私人留言
随笔分类
C++(14)
(rss)
c++模板(1)
(rss)
编程之美(29)
(rss)
面试题精解(2)
(rss)
算法(24)
(rss)
小作品(4)
(rss)
随笔档案
2014年6月 (1)
2013年3月 (2)
2012年11月 (1)
2012年8月 (2)
2012年5月 (2)
2012年3月 (4)
2012年2月 (2)
2011年9月 (1)
2011年8月 (1)
2011年7月 (8)
2011年5月 (2)
2011年4月 (2)
2011年3月 (4)
2010年12月 (5)
2010年9月 (2)
2010年8月 (20)
2010年7月 (2)
2010年6月 (3)
搜索
最新随笔
1. SEH异常处理专利到期了
2. 面试题: 找出数组中三个只出现一次的数
3. mingw gcc的头文件存在结构定义错误!!
4. c++11 最反直觉的地方
5. decltype的小“陷阱”
6. 内嵌汇编实现的函数转发
7. 一些老游戏CPU 100%占用的解决方法
8. 三国志5剧本修改器 1.2
9. 安全的整数比较
10. 面试题精解 目录
11. 面试题精解之二: 字符串、数组(1)
12. 避免计算过程中出现溢出的一个技巧
13. Fibonacci数计算中的两个思维盲点及其扩展数列的通用高效解法
14. 面试题精解之一: 二叉树
15. 喝汽水问题
16. 三国志5剧本修改器 1.1
17. 对环状数组求连续子数组的最大和
18. 最短摘要的生成(补充)
19. Fibonacci数列的两种O(lgn)解法
20. VC 2010 error D8027,无法执行c1xx.dll的解决方法
最新评论
1. re: 《编程之美》读书笔记02:1.3 一摞烙饼的排序
请问楼主可以换个主题吗,这个主题代码排版太不好了,复制也不方便。。。
--韩
2. re: 一道C++面试题的误区
对前3种算法,将数组长度增加到1e8,并对十组随机数组进行测试,得到结果:
--3d
3. re: 面试题: 找出二叉树上任意两个结点的最近共同父结点。
后序遍历到第一个满足这个条件的节点就是所要求的节点A。另外,还必须对这两个节点在一条线上的情况,做特殊处理。
--3d
4. re: 面试题精解之一: 二叉树
先固定B点不动(即B到C的距离不变),根据上面的公式,可得A到C的距离最大,即点A是C左子树下距离C最远的点,即:
--3d
5. re: 面试题: 找出数组中三个只出现一次的数
,当实际上发生溢出时,就是UB行为,编译器若进行些激进的优化就得不到正确结果。
--3d
6. re: SEH异常处理专利到期了
能让用户不再纠结SJLJ,Dwarf2的选择。
--3d
7. re: 《编程之美》读书笔记23: 1.1 让CPU占用率曲线听你指挥
评论内容较长,点击标题查看
--3d
8. re: 《编程之美》读书笔记15: 4.5 磁带文件存放优化
写的很好,很容易理解,赞
--zhenzhismile
9. re: 多重背包O(N*V)算法详解(使用单调队列)
评论内容较长,点击标题查看
--天天好赢钱
10. re: SEH异常处理专利到期了
评论内容较长,点击标题查看
--121e1212
阅读排行榜
1. 面试题精解之一: 二叉树(9457)
2. 面试题: 找出二叉树上任意两个结点的最近共同父结点。(8739)
3. VC 2010 error D8027,无法执行c1xx.dll的解决方法(7383)
4. 面试题: 找出数组中三个只出现一次的数(7014)
5. 多重背包O(N*V)算法详解(使用单调队列)(6480)
6. 螺旋矩阵 (4933)
7. 《编程之美》读书笔记08:2.9 Fibonacci序列 —— O(log n)求Fibonacci数列(非矩阵法)(4704)
8. 《编程之美》读书笔记23: 1.1 让CPU占用率曲线听你指挥(4632)
9. 《编程之美》读书笔记 目录(4046)
10. 一道C++面试题的误区(4001)
评论排行榜
1. 25匹马取前5(14)
2. 面试题: 找出二叉树上任意两个结点的最近共同父结点。(11)
3. 恶心的转载(11)
4. 《编程之美》读书笔记08:2.9 Fibonacci序列 —— O(log n)求Fibonacci数列(非矩阵法)(11)
5. Fibonacci数计算中的两个思维盲点及其扩展数列的通用高效解法(11)
6. 点在三角形内(1)(9)
7. 内嵌汇编实现的函数转发(8)
8. 一道C++面试题的误区(8)
9. 喝汽水问题(7)
10. decltype的小“陷阱”(5)
支持不同类型的 min 函数
看见别人的
帖子
,也做了下。
代码只支持内建类型。
1
#include
<
iostream
>
2
3
template
<
bool
, typename T, typename F
>
4
struct
Select_type
{ typedef T R; }
;
5
6
template
<
typename T, typename F
>
7
struct
Select_type
<
false
, T, F
>
{ typedef F R; }
;
8
9
template
<
typename T, typename S
>
10
struct
Larger_type
{
11
typedef typename Select_type
<
sizeof
(T)
>=
sizeof
(S), T, S
>
::R R;
12
}
;
13
14
template
<
typename T, typename S
>
15
typename Larger_type
<
T, S
>
::R min_value(T a, S b)
16
{
17
return
a
<
b
?
a : b;
18
}
19
20
21
int
main()
22
{
23
int
a
=
2
;
24
double
b
=
1.2
;
25
std::cout
<<
min_value(a, b)
<<
"
"
<<
min_value(b, a)
<<
"
\n
"
;
26
}
27
28
浮点数与整型进行比较时,默认整型转为浮点数
template
<
bool
, typename T, typename F
>
struct
Select_type
{ typedef T R; }
;
template
<
typename T, typename F
>
struct
Select_type
<
false
, T, F
>
{ typedef F R; }
;
template
<
typename T
>
struct
Type_rank
{
static
const
int
rank
=
0
; }
;
template
<>
struct
Type_rank
<
float
>
{
static
const
int
rank
=
21
; }
;
template
<>
struct
Type_rank
<
double
>
{
static
const
int
rank
=
22
; }
;
template
<>
struct
Type_rank
<
long
double
>
{
static
const
int
rank
=
23
; }
;
template
<
typename T, typename S
>
struct
Larger_type
{
static
const
int
fa
=
Type_rank
<
T
>
::rank;
static
const
int
fb
=
Type_rank
<
S
>
::rank;
static
const
bool
flag
=
fa
>
fb
||
(fa
==
fb
&&
sizeof
(T)
>=
sizeof
(S));
typedef typename Select_type
<
flag, T, S
>
::R R;
}
;
template
<
typename T
>
struct
Larger_type
<
T, T
>
{ typedef T R;}
;
template
<
typename T, typename S
>
typename Larger_type
<
T, S
>
::R min_value(T a, S b)
{
return
a
<
b
?
a : b;
}
posted on 2011-03-31 23:31
flyinghearts
阅读(1370)
评论(5)
编辑
收藏
引用
评论
#
re: 支持不同类型的 min 函数
2011-04-01 09:34
溪流
对内建类型来说,sizeof 谁大就转到谁,也不是最合理的
比如int->double,我认为应该可以转换;而float->long long呢?貌似应该不认为可转换吧
回复
更多评论
#
re: 支持不同类型的 min 函数
2011-04-01 18:44
so
就是嘛,推导返回类型的为T和S两类型中“较小”的那个。之前以为溪流要做的目地是根据实参a和b来推导返回类型呢。
回复
更多评论
#
re: 支持不同类型的 min 函数
2011-04-01 23:23
flyinghearts
@溪流
我采用:sizeof 谁大就转到谁,
是因为:对 long long 转 float 的情况, 转换很可能造成数据错误
(float无法表示所有的long数),写代码时,不应该允许这样的隐式转换。
应该显示的转为float。
另外,还假定了不允许 int和unsigned int等
有符号类型和相应的无符号类型进行比较
回复
更多评论
#
re: 支持不同类型的 min 函数
2011-04-02 09:40
溪流
@flyinghearts
是的,应该显式转换,但是我必须知道原始返回类型后,才能考虑如何转换得到的结果。当我写下min(1LL, 2.0f) 的时候,我该认为返回类型是什么呢?或者是你假定不允许写下min(1LL, 2.0f)?请注意,当写下“min(1LL, 2.0f)”的时候,我并不了解min内部做了什么,我只是认为在比较他们的大小,不会猜到min里面会进行类型转换,因此不会写成“min((float)1LL, 2.0f)”或者“min(1LL, (long long)2.0f)”。
回复
更多评论
#
re: 支持不同类型的 min 函数
2011-04-09 23:54
flyinghearts
@溪流
两个数必须类型一致才能比较(不一 致时,要进行隐式转换)。
当 long long 和 float 进行比较时,C++默认是将long long转为float,因为
float能表示的数的范围更广,但这可能带来错误的结果,
比如说:
float f = 1 << 29;
long long k = (1<<29)+1;
因此,调用者有责任将它们先转为同一类型再进行比较,比如都转为:double。
我刚更新了代码。可以通过rank的值大小,加上特化,控制类型的转换。
回复
更多评论
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
Powered by:
C++博客
Copyright © flyinghearts