< 返回版块

Neutron3529 发表于 2020-07-11 13:06

是这样的

在刷Leetcode的时候,有时候我们必须预处理出某些东西

比如预处理一下小于10^6的素数

理论上有两种处理方法,一种是,把所有素数都写到一起,弄个

const prime:[i32;78498]=[2,3,5,7,......];

但传几万个素数上去相当影响编译效率(还有代码可读性)

另一种应该是使用const fn,但stable版本暂时不支持const fn持有可变借用

就算nightly版...nightly告诉我,不允许出现for循环

想问一下,如果想做预处理(提前用const存那几万个素数)又不希望把那几万个素数都写在const里面,我应该怎么做。

有什么可以绕过Rust限制的奇怪姿势吗?

评论区

写评论
whfuyn 2020-07-21 23:15

绕过上传代码文件大小的限制不是一个正常的需求…… 刷OJ不用在意那么多吧,leetcode我刷的少,我在别的OJ上刷题都是直接运行时算的,没有遇到用这个卡时限的,这么卡也没有意义。

作者 Neutron3529 2020-07-11 23:13

关键问题是提前打表会让提交文件的尺寸膨胀好多好多啊

有时候竞赛要求文件小于50K,那么想打1M表的野心基本可以宣告破产,但编译期计算没这个问题

--
👇
gwy15: 要提前打表都是算好写 hardcode 吧?楼主是想做编译期计算?(类似 c++ 的模板 meta programming?)

编译期运算编译起来不可能比提前打表更快啊 = =

gwy15 2020-07-11 20:46

要提前打表都是算好写 hardcode 吧?楼主是想做编译期计算?(类似 c++ 的模板 meta programming?)

编译期运算编译起来不可能比提前打表更快啊 = =

作者 Neutron3529 2020-07-11 20:40

但总觉得这样的做法

include!必须引用一个文件

也就是我们必须在哪里生成/记录这些素数分别是什么

总觉得有点浪费空间的意思

不过……总算学到一个引入外部数据的方法

以后,至少可以试着把const存到其他文件中以增加代码可读性了

BTW,总觉得论坛的分割线写错了

正确的分割线是

(换行)
---
(换行)

--
👇  

似乎变不成分割线


👇
Mike Tang: 把公用逻辑抽成crate,是可以两边用的。

Mike Tang 2020-07-11 20:18

把公用逻辑抽成crate,是可以两边用的。

作者 Neutron3529 2020-07-11 17:04
Using this macro is often a bad idea, because if the file is parsed as an expression, it is going to be placed in the surrounding code unhygienically. This could result in variables or functions being different from what the file expected if there are variables or functions that have the same name in the current file.

看上去include!的用处只是把表达式复制过去

并不能在预处理的时候进行常量计算的

如果希望读取几万个素数,我们只能预先把素数算好,然后存起来,然后用include!读取

用build.rs算,include!()引用,需要把代码分散到许多不同的文件中,总觉得有点难以维护

……不过无论如何,这大概也算一种方法吧……


👇
Mike Tang: build.rs + include!() 满足你的需求。

Mike Tang 2020-07-11 16:09

build.rs + include!() 满足你的需求。

1 共 7 条评论, 1 页