「随机生成」适合造简单数据;一旦需要树、图、几何这种带结构的数据,随机参数就不够用了。7.1.0 因此加了生成器代码模式:用户直接写一段 C++,把数据打到标准输出,其余交给程序。
一次点击做了四件事
- 把编辑器里的代码写成临时源文件
%TEMP%\cdc_gen\generator.cpp - 调用 g++ 编译成
generator.exe(自动带上内置库的头文件路径) - 对每个数据点编号
i运行一次:generator.exe <i> - 把该次运行的标准输出直接存成
<数据目录>\<i>.in
编译命令
"g++.exe" -O2 -std=c++23 -static -static-libgcc -static-libstdc++ \
-I"<exe 目录>\cdc_lib" "%TEMP%\cdc_gen\generator.cpp" \
-o "%TEMP%\cdc_gen\generator.exe"| 参数 | 作用 |
|---|---|
-std=c++23 | 生成器可以直接使用 C++23 的语法与标准库设施 |
-O2 | 造大规模数据时明显更快 |
-static 系列 | 生成器不依赖任何 MinGW 运行库,拷到别的机器也能跑 |
-I"cdc_lib" | 自动挂上内置的 CDCSCQ 函数库,源码里 #include <cdcscq.hpp> 不用自己配路径 |
数据点编号是生成器的输入
每次运行都会把编号当成第一个命令行参数传进去。CDCSCQ 提供了 case_id() 把它取出来,于是同一份代码可以按编号产出规模递增的数据:
#include <cdcscq.hpp>
using namespace cdcscq;
int main() {
seed(); // 时间播种
int n = 10 * case_id(); // 第 1 个点 n=10,第 2 个点 n=20 …
out_vec(seq(n, 1, 1000000000));
return 0;
}防御与容错
- 单次最多 1000 个数据点 —— 编号上限在服务端被截断,避免误填一个巨大的结束编号把磁盘写满
- 数据目录必须是绝对路径 —— 半吊子路径(如
桌面\xxx)会被拒绝并提示,防止文件写到意料之外的位置 - 运行失败的半截文件会被删除 —— 生成器退出码非 0 时,该
.in直接清掉,不留残次品 - 只检查代码不生成 —— 模式选「仅检查」时编译通过即返回,不写任何数据文件