C语言————快速读取小技巧

在C++中,快速读取主要用于提升输入操作的效率,尤其是在处理大规模数据时。

快读的优点

相比于cin,快速读取方法通常具有以下优点:

1. 速度更快

  • cin的缺点cin是C++标准库中的输入流,虽然易用,但默认情况下它与stdin同步,且会进行类型检查,导致性能较低。

  • 快速读取的优点:通过使用C标准库函数(如scanf)或手动实现的快速读取函数(如getchar),可以显著减少输入操作的时间。

2. 减少开销

  • cin的缺点cin会进行额外的类型检查和格式化操作,增加了运行时的开销。

  • 快速读取的优点:快速读取方法通常直接读取字符并手动解析,避免了这些额外开销。

3. 适用于大规模数据

  • cin的缺点:在处理大规模数据时,cin的性能瓶颈会变得明显。

  • 快速读取的优点:快速读取方法特别适合处理大规模数据输入,如算法竞赛中的大数据量场景。

4. 灵活性

  • cin的缺点cin的格式化输入功能有限,难以应对复杂的输入格式。

  • 快速读取的优点:快速读取方法可以根据具体需求灵活处理输入格式。

 快读:

快读相比cin的优点说人话就是在读取已知类型的大量数据时(例如算法题中输入的动辄几千个的数据),可以免去类型检查并进行快读读取(依靠getchar),自己定义的读取函数更加灵活(比如可以把一个6位整数的前3位和后三位分别读取)。

读取正int型:

int read() {
    int x = 0;
    char ch = getchar();
    while (ch >= '0' && ch <= '9') {
        x = x * 10 + (ch - '0');
        ch = getchar();
    }
    return x;
}

读取正反int型:

int read() {
    int x = 0,f=1;
    char ch = getchar();
    while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch=getchar();}
    while (ch >= '0' && ch <= '9') {
        x = x * 10 + (ch - '0');
        ch = getchar();
    }
    return x*f;
}

使用C++的引用更加简洁:

void read(int &n) {
    int x = 0,f=1;
    char ch = getchar();
    while(ch<'0'||ch>'9'){if(ch=='-'){f=-1;}ch=getchar();}
    while (ch >= '0' && ch <= '9') {
        x = x * 10 + (ch - '0');
        ch = getchar();
    }
    n= x*f;
}
int main() {
    int n;
    read(n);
    cout<<n;
}

cin和cout的加快

ios::sync_with_stdio(false);
cin.tie(nullptr);

1. ios::sync_with_stdio(false) 的作用

  • 默认行为:C++ 的标准输入输出(cin/cout)默认与 C 的标准输入输出(stdio)保持同步。这意味着每次cin/cout操作后,都会刷新缓冲区,以确保 C 和 C++ 的输入输出函数混合使用时的正确性。
  • 关闭同步ios::sync_with_stdio(false) 会关闭这种同步机制,从而减少不必要的缓冲区刷新操作,大幅提升输入输出速度。
  • 适用场景:当代码中不混用cin/cout和 C 的scanf/printf时,可以安全地关闭同步。

2. cin.tie(nullptr) 的作用

  • 默认绑定cin 默认与 cout 绑定(即 cin.tie(&cout))。每次执行cin操作前,会自动刷新cout的缓冲区。
  • 解除绑定cin.tie(nullptr) 会解除cincout的绑定,避免每次输入前强制刷新输出缓冲区,进一步提升输入效率。
  • 注意:如果需要确保cout的输出在cin输入前刷新(例如交互式程序),则不应解除绑定。
  • 不能进行交互,所有cout一起输出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值