当前位置: 首页 > article >正文

C++ 快速输入的优化与缓冲区管理(竞赛必用)

在编程竞赛和性能敏感的场景中,数据输入的效率往往直接影响到程序的运行速度。为了优化输入操作,我们可以通过手动设定缓冲区的方式来提升输入的速度。本文将详细介绍两种不同的快速输入方案:手动设定缓冲区大小的方案与系统默认缓冲区大小的方案,并结合二进制位数与可表示数据范围的关系进行深入分析。


手动设定缓冲区大小的快速输入方案
char buf[1 << 24], *p1 = buf, *p2 = buf;

#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 24, stdin), p1 == p2) ? EOF : *p1++)

// 自定义快速输入函数
inline int read() {
    int x = 0;
    char ch = getchar();
    while (ch < '0' || ch > '9') ch = getchar();
    while (ch >= '0' && ch <= '9') {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x;
}
系统默认缓冲区大小的快速输入方案
// 自定义快速输入函数
inline int read() {
    int x = 0;
    char ch = getchar();
    while (ch < '0' || ch > '9') ch = getchar();
    while (ch >= '0' && ch <= '9') {
        x = x * 10 + ch - '0';
        ch = getchar();
    }
    return x;
}

缓冲区的管理与输入操作的执行时机

在手动设定缓冲区大小的方案中,数据先被大量输入到缓冲区中,只有在程序需要获取具体数据时,才会从缓冲区中读取数据并存储到对应的变量中。这种方法能够显著提高输入速度,尤其是在大量数据输入的情况下。

  1. 手动设定缓冲区大小:缓冲区用于存储从键盘或文件输入的大量数据,只有在程序需要数据时,才会从缓冲区中读取。fread() 函数负责一次性从标准输入流中读取数据到缓冲区,并且当缓冲区为空时,会触发重新读取操作。

  2. 系统默认缓冲区大小:在不设定缓冲区大小的方案中,每次输入操作都会直接从输入流中读取数据,这可能导致频繁的 I/O 操作,进而影响程序的运行效率。

二进制位数与可表示数据范围的表格

二进制位数可表示的数据范围(整型)
8位0 到 255(无符号),-128 到 127(有符号)
16位0 到 65,535(无符号),-32,768 到 32,767(有符号)
32位0 到 4,294,967,295(无符号),-2,147,483,648 到 2,147,483,647(有符号)
64位0 到 18,446,744,073,709,551,615(无符号),-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807(有符号)
128位0 到 340,282,366,920,938,463,463,374,607,431,768,211,455(无符号)

fread() 函数的介绍

fread() 是 C 语言标准库函数,用于从文件流中读取数据。它的函数原型如下:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
  • 参数解释

    • ptr: 指向存储读取数据的内存块的指针。
    • size: 要读取每个数据元素的大小(以字节为单位)。
    • nmemb: 要读取的数据元素的个数。
    • stream: 指向文件流的指针,通常是 stdin 表示标准输入。
  • 功能fread() 读取 nmemb 个数据元素,每个大小为 size 字节,并将它们存储到 ptr 指向的缓冲区中。该函数返回实际读取到的元素个数。

  • 应用场景:常用于高效读取大量数据,尤其是在文件操作和数据流处理中。

总结

手动设定缓冲区大小的输入方式能够显著提高程序的输入效率,特别是在处理大量数据时。结合二进制位数与数据范围的表格,可以帮助程序员选择适合的数据类型,以优化程序性能。此外,通过了解 fread() 函数及其工作原理,可以更好地控制数据流的读取操作,从而在竞赛中取得优势。

最佳实践

在编程竞赛中,选择合适的输入方法至关重要。当数据规模巨大且输入速度成为瓶颈时,手动设定缓冲区大小的方法显然是优选。但在数据规模较小且不需要复杂操作时,系统默认的输入方式则更加简便易用。


http://www.kler.cn/a/282843.html

相关文章:

  • 【NLP】医学搜索Query相关性判断【阿里云:天池比赛】
  • python习题练习
  • 速盾:如何有效防止服务器遭受攻击?
  • 提升前端性能:如何优化多个异步请求的执行效率Promise.all()
  • 基于yolov8、yolov5的鱼类检测识别系统(含UI界面、训练好的模型、Python代码、数据集)
  • catchadmin-webman 宝塔 部署
  • 使用requests库发起post请求处理json的两种方式
  • ROS 2 Jazzy和QT组合开发教程
  • 音频PCM的能量dB计算
  • 一个符合软件开发工程师认知的思考框架简单了解下
  • 1899. 最满意的方案
  • 盛元广通高等级生物安全实验室管理系统2.0
  • 【私有云场景案例分享②】批量装包与冒烟测试的自动化实现
  • Linux——进程管理
  • 嵌入式Linux学习笔记-Linux基础操作
  • Elasticsearch 8.13.4 LocalDateTime类型转换问题
  • 使用seamless-scroll-v3 实现无缝滚动,自动轮播平滑的滚动效果
  • Linux系统——服务器长时间训练不间断指令(nohup的简单用法)
  • PsConvertToGuiThread函数调用前传
  • 力扣第二阶段Days34
  • AI在医学领域:GluFormer一种可泛化的连续血糖监测数据分析基础模型
  • 自动化任务工具 | zTasker v1.97.1 绿色版
  • [Hive]四、Hive On Tez
  • 私域流量升级下的新机遇——“开源 AI 智能名片S2B2C 商城小程序”与新兴技术的融合
  • ARM/Linux嵌入式面经(二七):韶音
  • Java LeetCode 练习