大数据文件读取技巧

一、ios::sync_with_stdio(false);

    

    作用数据(文件)读取速度更快

    

    算法竞赛中,关闭iostream对象和cstdio流同步以提高输入输出的效率。

   即调用ios::sync_with_stdio(false);    

    特别注意:

    (1)关闭后C++ IOCIO不能混用,cin不能与scanfsscanf, getchar, fgets等混用,cout不能与printfputs等混用,否则IO会混乱。

    (2)在默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)0表示NULL)来解除cincout的绑定,进一步加快执行效率。即调用std::cin.tie(0);

#include <iostream>
int main() 
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    // 下面进行IO
}

注:

C++ 双冒号开头的语法功能:命名空间限定

如:

std::string  //表示std命名空间下的 string类

补充:双冒号(::)用法

1)表示域操作符
例:声明了一个类 A ,类 A 里声明了一个成员函数 void f() ,但没有在类的声明里给出 f 的定义,那么在类外定义 f 时,  
就要写成 void A::f() ,表示这个 f() 函数是类 A 的成员函数。
2)直接用在全局函数前,表示是全局函数  
例:在 VC 里,你可以在调用 API 函数前,在 API 函数名前加::
3)表示引用成员函数及变量,作用域成员运算符

    std是一个全局命名空间  ios是一个内部命名空间(位于std下)

    所以引用方式如下

    ::std::ios::ostream

    ::std::string

    当没有冲突的时候,全局的::(也就是第一个)可以省略


二、使用std::ios::tie与std::ios_base::sync_with_stdio加速流

1. std::ios_base::sync_with_stdio 

  cstdio[静态]切换同步

    打开或关闭所有的标准iostream流与它们对于的标准C流之间的同步。

    实际上,这意味着C++C流使用相同的缓冲区,因此,可以自由地混合使用流。同步C++标准流可以确保线程安全。

默认情况下,iostream对象和cstdio流同步。如果同步关闭,C++标准流独立地缓冲输入输出,在某些情况下,这是相当快速的。

  参数

    syn

    用于指示是否同步的布尔值,值为true开启同步,为false时关闭同步。

  返回值

    返回被调用之前的同步状态。当它第一次被调用,总是返回true

  使用样例

#include <iostream>
#include <cstdio>
 
int main()
{
    std::cout.sync_with_stdio(false);
    std::cout << "a\n";
    std::printf("b\n");
    std::cout << "c\n";
}

    程序输出

    b

    a

    c

2. std::ios::tie

    在默认的情况下cin绑定的是cout,c++11cincerr都默认和cin绑定。


其它加速方法

    使用'\n'或者"\n"代替endl。即使用cout<<'\n';cout<<"\n";






发布了35 篇原创文章 · 获赞 37 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_34519487/article/details/79935106