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

C++竞赛级输入输出优化实战

一、输入方式

1. cin 基础用法
  • 跳过空白符读取

    int a; double b; string s;
    cin >> a >> b >> s; // 自动跳过空格/换行符
    
    • 按变量类型读取,遇到空白符停止。
  • 缺点:不处理类型不匹配的情况(如输入字符给整型变量)。

  • 读取单个字符

    char c;
    cin >> c; // 跳过空白符,读取第一个非空白字符
    cin.get(c); // 读取任意字符(包括空格/换行)
    
  • 整行读取

    string line;
    getline(cin, line); // 读取到换行符(换行符被丢弃)
    
    • 注意:前序输入可能残留换行符,需先执行 cin.ignore()

2. scanf 格式化输入
  • 基本格式符

    int a; double b; char str[100];
    scanf("%d %lf %s", &a, &b, str); 
    // 注意:%lf对应double,%s以空格/换行结束
    
    • 常用格式符:%d(int)、%lld(long long)、%c(字符)、%f(float)、%lf(double)。
    • 安全字符串读取scanf("%9s", str); (限制最大长度为9,防止溢出)。
  • 特殊用法

    • 忽略特定字符
      scanf("%d,%d", &a, &b); // 输入格式如 "123,456"
      
    • 扫描集(读取特定字符集合):
      scanf("%[a-zA-Z]", str); // 只读取字母
      

3. 高效读取(算法竞赛优化)
  • 禁用同步 & 解绑

    ios::sync_with_stdio(false); // 关闭与stdio的同步
    cin.tie(nullptr);            // 解除cin与cout的绑定(减少刷新)
    

    此后仅使用 cin/cout,不可混用 scanf/printf

  • 读取优化示例

    #include <iostream>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int n;
        cin >> n;
        // 后续使用cin快速读取...
    }
    

二、输出方式

1. cout 基础用法
  • 直接输出

    int a = 10;
    double b = 3.1415926;
    cout << a << " " << b << endl;
    
  • 控制小数精度

    #include <iomanip>
    cout << fixed << setprecision(2) << b; // 输出 3.14(四舍五入)
    

2. printf 格式化输出
  • 常用格式符
    printf("%d\n", a);          // 整数
    printf("%10d\n", a);        // 宽度10,右对齐
    printf("%-10d\n", a);       // 左对齐
    printf("%.2f\n", b);        // 两位小数
    printf("%08d\n", a);        // 宽度8,前导零填充
    
    • 技巧%lld(long long)、%x(十六进制)。

3. 输出优化
  • 避免频繁刷新:使用 '\n' 代替 endl
    cout << a << '\n'; // 比endl更快
    

三、特殊场景处理

1. 混合输入类型
  • 示例:先读整数,再读一行。
    int n;
    string s;
    cin >> n;
    cin.ignore(); // 清除之前残留的换行符
    getline(cin, s);
    
2. 字符串流分割
#include <sstream>
string line = "1 2 3";
istringstream iss(line);
int a, b, c;
iss >> a >> b >> c; // 分割字符串内容

四、算法竞赛建议

  1. 输入优先选 scanf(更快),或优化后的 cin
  2. 输出优先选 printf(格式控制灵活)
  3. 对时间要求极高时,关闭同步+解绑(保证不混用C/C++ IO)。
  4. 处理大规模数据前,预分配容器内存(如 vector.reserve())。

通过上述方式系统梳理,结合高频使用场景和效率优化技巧,在算法竞赛中可显著提升代码效率并减少调试时间。


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

相关文章:

  • 通过Golang的container/list实现LRU缓存算法
  • 大数据任务调度:DolphinScheduler、Airflow 实战(调度策略、任务依赖)
  • Python基于深度学习的电影评论情感分析可视化系统(全新升级版)【附源码、参考文档】
  • 【每日学点HarmonyOS Next知识】拖拽调整列表顺序、tab回弹、自定义弹窗this、状态变量修饰枚举
  • 工作中,当遇到要把http请求变成https时 怎么处理
  • spring 的model repository service controller的功能
  • Yashan DB 文件管理
  • 《深度剖析架构蒸馏与逻辑蒸馏:探寻知识迁移的差异化路径》
  • 【音视频】ffmpeg命令提取像素格式
  • 20250212:linux系统DNS解析卡顿5秒的bug
  • 在 Spring Boot 2.7.x 中引入 Kafka-0.9 的实践
  • vscode 好用插件
  • MySQL-储存引擎
  • 深度解析:如何在 Vue 3 中安全访问子组件实例
  • 使用STM32CubeMX配置定时器中断实现LED每秒闪烁一次(STM32G070CBT6)
  • windows上传uniapp打包的ipa文件到app store构建版本
  • Selenium 中 ActionChains 支持的鼠标和键盘操作设置及最佳实践
  • 密码学系列 - 利用CPU指令加速
  • 高效自动化测试:打造Python+Requests+Pytest+Allure+YAML的接口测试框架
  • 鸿蒙NEXT开发-自定义相机拍照