输入输出处理

1.io优化

const char endl = '\n';
 //另外,请使用'\n'而不是 endl ,因为endl默认会增加刷新操作,而导致输出缓冲失效,降低效率。
cin.tie(0);
ios::sync_with_stdio(false);
  • cin.tie(0) 和 ios::sync_with_stdio(false) 是 C++ 中用于优化输入输出的语句。
  1. cin.tie(0) 的作用是取消 cin 与 cout 的绑定,默认情况下,当使用 cin 进行输入操作时,会先执行 cout 的缓冲输出。使用 cin.tie(0) 可以将 cin 和 cout 解绑,让它们可以独立地进行操作,从而提高输入输出的效率。

  2. ios::sync_with_stdio(false) 则是取消 C++ 标准库输入输出流和 C 标准库输入输出流之间的同步。

  3. 默认情况下,C++ 标准库的输入输出流与 C 标准库的输入输出流是同步的,这就意味着在混合使用 C++ 的 cin/cout 和 C 的 scanf/printf 时,需要确保两者的输入输出顺序不会混乱。

  4. 但是,由于 C++ 的输入输出流效率较低,当不涉及到混用 C++ 和 C 的输入输出时,可以通过 ios::sync_with_stdio(false) 来取消同步,从而提高输入输出效率。

2.快读模板

#include <iostream>

inline int read()
{
    int x=0,f=1;   // 初始化变量x为0,f为1,x表示最终读取到的整数,f表示最终的符号(正负)
    char ch=getchar();   // 从输入流中读取一个字符,并将结果赋值给变量ch
    while(ch<'0'||ch>'9')   // 当字符ch不是数字字符时,执行循环体
    {
        if(ch=='-')   // 如果字符ch是负号'-'
            f=-1;    // 将符号f置为-1,表示最终的整数为负数
        ch=getchar();   // 继续从输入流中读取下一个字符,并将结果赋值给变量ch
    }
    while(ch>='0' && ch<='9')   // 当字符ch是数字字符时,执行循环体
    {
        x=x*10+ch-'0';   // 将当前数字字符转换成整数并累加到变量x中
        ch=getchar();   // 继续从输入流中读取下一个字符,并将结果赋值给变量ch
    }
    return x*f;   // 返回读取到的整数乘以符号f,考虑到负号的情况
}

int main()
{
    int num = read();   // 调用read函数,从输入流中读取一个整数,将结果赋值给变量num
    std::cout << "The number is: " << num << std::endl;   // 打印读取到的整数
    return 0;
}

(1). inline是C++中的关键字,用于对函数进行内联展开优化。

  • 当我们定义一个函数并将其标记为inline时,编译器会尝试在调用该函数的地方直接将函数的代码插入,而不是进行正常的函数调用。这样可以减少函数调用的开销,提高程序的执行效率。

  • 一般来说,内联展开适用于函数体较小且频繁调用的情况。然而,对于复杂的函数或者递归调用的函数,不适合使用内联。

  • 在给函数加上inline关键字之后,可以使得函数的调用更加高效,但是具体是否真的会进行内联展开取决于编译器的决策。

  • 在本例中,inline关键字被用于修饰read()函数。这意味着编译器可能会将read()函数的代码内联展开,以避免函数调用的开销。

  • 注意:inline关键字仅是向编译器提供的一种优化建议,并不是强制要求编译器进行内联展开。编译器最终决定是否进行内联展开还是进行普通的函数调用。

3.对于不知道有多少组_整数数据_的的输入处理

   while (std::cin >> n)
  1. 当使用 std::cin 直接读取输入时,它会返回一个流对象 std::cin 本身。这个流对象可以被视为一个条件表达式,在输入成功并且没有错误的情况下,它的值为 true,否则为 false。
    std::cin >> n 表达式尝试将输入流中的数据读取到变量 n 中。如果成功读取到数据,则条件表达式为 true,循环体中的代码会被执行。如果无法读取到数据或者读取过程中发生错误(例如输入不符合预期的格式),条件表达式为 false,循环将终止。
    因此,while (std::cin >> n) 这样的循环结构能够在每次成功读取到一个数据时执行循环体,并持续进行输入处理,直到无法读取到数据或者满足了某个跳出循环的条件。
while (scanf("%d", &n) == 1
  • 2.与使用 std::cin 不同的是,scanf 函数返回成功读取的输入项的数量。在本例中,我们期望读取到一个整数 n,因此使用 scanf("%d", &n) 来尝试读取一个整数,并将结果存储在变量 n 中。
    如果成功读取到一个整数,scanf 的返回值将为 1,条件表达式为 true,循环体中的代码会被执行。如果无法读取到整数或者读取过程中发生错误,scanf 的返回值将为 0 或负数,条件表达式为 false,循环将终止。
   while (scanf("%d", &n) != EOF
   while(~scanf("%d", &n)) 
   //    EOF,为End Of File的缩写,通常在文本的最后存在此字符表示资料结束。EOF通常的值为-1。

       
————————————————

  • 3.我们使用 scanf 函数来读取输入,并通过检查其返回值是否等于 EOF(文件结束标志)来判断是否到达文件末尾。
    scanf("%d", &n) 尝试读取一个整数,并将结果存储在变量 n 中。如果 scanf 成功读取到一个整数,则返回值为 1。当遇到文件结束标志时,scanf 返回值为 EOF。
    只有当 scanf 成功读取整数且不等于 EOF 时,循环体中的代码才会执行。在循环体内部,可以根据需要使用类似的方式去读取其他变量的值。
  1. 4.while(~scanf("%d", &n)) 意思就是当有值输入的时候,进入while,当没有值输入时就结束while。
  • (输入了值,如果scanf成功读取了就返回1,取反的结果不为0,进入while;
  • 如果scanf没有成功读取,返回0,取反的结果不为0,进入while;
  • 如果没有输入,到达文件末尾则返回-1,取反的结果为0,结束while。)
while(cin>>n&&n!=1116)
  • 5.这段代码是一个循环,它会不断尝试从输入中读取整数,并将读取的整数赋值给变量n。循环将一直执行,直到读取到的整数为1116或者无法再继续读取整数为止。
    cin >> n 是用来读取输入的整数并将其赋值给变量n。当成功读取到一个整数时,条件判断为真,继续执行右侧的逻辑;如果无法读取到整数(例如遇到了非法输入或文件结束符),条件判断为假,循环结束。
    n != 1116 是另外一个条件判断,用于检查n是否等于1116。当n不等于1116时,条件判断为真,循环继续执行。当n等于1116时,条件判断为假,循环结束。
    换句话说,这段代码的作用是循环等待用户输入一个整数,并将其赋值给变量n。当读取到的整数为1116或者无法继续读取整数时,循环结束。

3.字符和字符串输入以及常用函数对比分析

热门相关:我的治愈系游戏   本法官萌萌哒   豪门情变,渣总裁滚远点!   大妆   拒嫁豪门,前妻太抢手