matlab寻找三位数的全数字,有没有更好的方法来获得数字的位数?(C++)

本文探讨了一种非正统的方法来同时存储整数和其字符串表示,以提高效率。通过使用带有脏标志的结构,只在需要时计算字符串,从而减少不必要的计算。这种方法借鉴了数据库中预计算列的概念,将计算成本分摊到读取操作中,适合写入频繁而读取不频繁的场景。此外,还提到了库函数的使用和性能比较的重要性。
摘要由CSDN通过智能技术生成

通过“避免使用字符串”,我假设您这样做是因为如果您想要一个整数值,那么只使用字符串表示的效率非常低。

为此,我建议采取一种稍微非正统的方法

可以

要合适。不要以一种形式存储它们,将它们存储在

二者都

. 下面的代码是C-它将

工作

在C++中,但是你可能想考虑使用C++等价物——但是它背后的思想并没有改变。

通过“存储这两个表单”,我的意思是您可以具有如下结构:

typedef struct {

int ival;

char sval[sizeof("-2147483648")]; // enough for 32-bits

int dirtyS;

} tIntStr;

并传递此结构(或其地址),而不是整数本身。

通过使用宏或内联函数,如:

inline void intstrSetI (tIntStr *is, int ival) {

is->ival = i;

is->dirtyS = 1;

}

inline char *intstrGetS (tIntStr *is) {

if (is->dirtyS) {

sprintf (is->sval, "%d", is->ival);

is->dirtyS = 0;

}

return is->sval;

}

然后,要设置该值,您将使用:

tIntStr is;

intstrSetI (&is, 42);

当你想要字符串表示的时候:

printf ("%s\n" intstrGetS(&is));

fprintf (logFile, "%s\n" intstrGetS(&is));

这有一个优点,即只在需要时计算字符串表示形式(即

fprintf

上面不必重新计算字符串表示形式和

printf

只有当它脏的时候)。

这与我在SQL中使用预计算列和触发器时使用的技巧类似。这里的想法是,您只在需要时执行计算。因此,一个额外的列来保存索引的低位姓氏以及一个用于计算它的插入/更新触发器,通常比

select lower(non_lowercased_last_name)

. 这是因为它将计算成本(在写入时完成)分摊到所有读取中。

从这个意义上说,如果您的代码配置文件是

set-int/use-string/set-int/use-string...

. 但是,如果是的话

set-int/use-string/use-string/use-string/use-string...

,您将获得性能提升。

当然,这是有代价的,只需要最少的额外存储空间,但大多数性能问题归结为空间/时间的权衡。

如果你

真的?

为了避免字符串,您仍然可以使用相同的方法(仅在需要时才计算),只是计算(和结构)会有所不同。

作为旁白:

您很可能希望使用库函数来完成这项工作,而不是手工编写自己的代码。库函数通常会进行大量的优化,可能比编译器从代码中获得的优化还要多(当然,这并不能保证)。

也可能是

itoa

如果你有,可能会跑赢

sprintf("%d")

同时,考虑到其有限的用例。不过,你应该,

测量,而不是猜测!

不仅是在库函数方面,还包括整个解决方案(以及其他解决方案)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值