首页 > 编程语言 >C++ 快速输入的优化与缓冲区管理(竞赛必用)

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

时间:2024-08-30 15:51:57浏览次数:12  
标签:ch 必用 C++ 缓冲区 size 数据 输入 读取

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


手动设定缓冲区大小的快速输入方案
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() 函数及其工作原理,可以更好地控制数据流的读取操作,从而在竞赛中取得优势。

最佳实践

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

标签:ch,必用,C++,缓冲区,size,数据,输入,读取
From: https://blog.csdn.net/weixin_72391681/article/details/141716539

相关文章

  • C++第十四弹 -- STL之queue和priority_queue深度剖析
    目录前言1.queue的介绍与使用1.1.queue的介绍1.2为什么容器类不选vector?1.3queue的使用1.4OJ用队列实现栈2.queue的模拟实现3.deque的介绍3.1什么是适配器3.2STL标准库中stack和queue的底层结构3.3deque的简单介绍4.priority_queue的介绍与使用4.1介绍4.2......
  • 学习笔记4——二叉树(C++版)
    关于二叉树的算法题一般都是使用递归来实现,所以要想做好二叉树的算法题,要先学会递归算法的使用。一、如何创建一个二叉树1.声明一个树节点结构体structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode(intx):val(x),left(nullptr),ri......
  • c++解析xml文件实际应用(增删改查进阶)看完必会
    《c++解析xml文件(增删改查)看完必会》遍历xml所有节点下的数据已经在上一篇文章末尾写道,写法大同小异,资源下载也在上一篇提到,这里就不再提及,这篇博客主要是对上一篇基础知识的运用,如有疑问,可以call我XML解析类#include<iostream>#include<string>#include<string.h>#include......
  • C++学习随笔——C++11的array、forward_list、tuple的用法
    1.std::arraystd::array是C++11引入的一个封装了原生数组的容器,它结合了C++标准库容器的优点和C风格数组的效率。#include<array>#include<iostream>intmain(){std::array<int,5>arr={1,2,3,4,5};//初始化一个大小为5的数组//访问元素......
  • C++学习随笔——委托构造函数
    C++11中,引入了委托构造函数(delegatingconstructors)的概念。委托构造函数允许一个构造函数调用同一个类中的另一个构造函数,以减少代码重复。 委托构造函数的语法:classMyClass{public:MyClass(intx):value(x){//这个构造函数初始化value}M......
  • 【C++】vector(下)--上篇
    个人主页~vector(上)~vector二、vector的模拟实现1、了解组成2、vector.h(1)为什么有了size_t参数的vector构造函数还要再写一个int参数的重载vector构造函数(2)为什么reserve不用memcpy(3)reserve和resize的相关解释(4)迭代器失效问题详解二、vector的模拟实现1、了解组......
  • 【C/C++进阶】——文件操作之文本文件与二进制文件指针读写
    【文件】——操作文件目录一:文件的定义二:文件名三:文件类型3.1:二进制文件3.2:文本文件四:文件的打开与关闭4.1:文件指针4.2:文件的打开与关闭五:文件的顺序读写5.1:读写字符5.2:读写字符串5.3:读写格式化数据六:文件的随机读写6.1:fseek6.2:ftell6.3:rewind七:文件读取结......
  • 《C++模板元编程:编程世界的魔法艺术》
    在C++的广阔编程领域中,模板元编程犹如一种神秘而强大的魔法艺术,为开发者打开了一扇通往极致性能与高度灵活性的大门。那么,究竟什么是模板元编程?又该如何在C++中进行模板元编程呢?首先,让我们来理解一下模板元编程的概念。模板元编程是一种在编译期进行计算和代码生成的技术......
  • c++偶现问题备录
    目录C++偶现问题备录1.偶现问题源码2.问题根因分析3.修复问题源码C++偶现问题备录1.偶现问题源码源码示例如下:classKZNCalculationException:publicstd::exception{public:#ifdefKZN_LINUXKZNCalculationException(GStringAMsg,GStringAHit):st......
  • Qt | Qt是C++最好的图形界面开发库(学习路线图)
    点击上方"蓝字"关注我们01、WhatisQt?>>>Qt是一个跨平台的C++图形用户界面库,目前包括QtCreator、QtDesigner等等快速开发工具。Qt支持所有Linux/Unix系统,还支持windows平台。Qt很容易扩展,并且允许真正地组件编程。Qt与GTK、MFC、OWL、ATL 是一样的图形界......