1
ios::sync_with_stdio(0);
ios::sync_with_stdio(false);
是 C++ 中用于关闭 C++ 输入输出流(iostream)与 C 输入输出库(stdio)同步的语句。默认情况下,C++ 的流库与 C 的stdio库是同步的,这意味着你可以混用 cin
, cout
和 scanf
, printf
等而不会出现问题。但是这种同步会导致性能下降,因为每个流库的操作都需要检查stdio库的状态。
当你设置 std::ios_base::sync_with_stdio(false);
时,你告诉 C++ 不必再与stdio库同步。这将提高输入输出操作的效率,特别是当你在程序中使用大量的 I/O 操作时。但是,这样做之后你就不能再保证 cin
, cout
和 C 的 scanf
, printf
混用时的正确性了。通常,在竞赛编程或者需要高性能 I/O 的场合,程序员会关闭同步,并使用 cin.tie(0);
进一步提高性能,因为这样可以解除 cin
和 cout
之间的绑定,使得 cin
和 cout
可以独立地、不按顺序地缓冲它们的 I/O 操作。
使用这个语句的典型场景是在程序的开头:这样做之后,你应该只使用 cin
和 cout
或者只使用 scanf
和 printf
,避免混用,以防止未定义行为。
2
cin.tie(0); cout.tie(0);
在 C++ 中,cin.tie()
和 cout.tie()
是与流对象的绑定相关的函数。默认情况下,cin
和 cout
是绑定的,这意味着当 cin
和 cout
同时用于输入和输出时,它们会保证输出的顺序与输入的顺序一致。这种绑定是为了让输出与输入保持同步,比如在交互式程序中,你希望在读取输入之前先看到所有的输出。
cin.tie(nullptr)
或 cin.tie(0)
的作用是取消 cin
和 cout
之间的绑定。这样,cin
的输入缓冲区和 cout
的输出缓冲区就可以独立地运作,不再需要等待对方。这通常可以提高 I/O 效率,特别是在进行大量 I/O 操作时。
同样地,cout.tie(nullptr)
或 cout.tie(0)
也可以用来取消 cout
的当前绑定。但是,通常你不需要这样做,因为 cout
默认就是与 cin
绑定的,而且取消 cin
的绑定通常也就意味着 cout
的绑定也被取消了。
3
priority_queue<int,vector<int>,greater<int>> h[100010]; //为每一家店创造一个优先队列(小顶对)
在 C++ 中,priority_queue<int, vector<int>, greater<int>> h[100010];
声明了一个包含 100010 个优先队列的数组 h
。每个优先队列都是使用 int
作为元素类型,vector<int>
作为底层容器,greater<int>
作为比较器的。
priority_queue
是 C++ 标准库中的一个容器适配器,它提供常数时间内的最大元素提取操作,即每次调用 pop
时移除的是队列中最大的元素,每次调用 top
时访问的是队列中最大的元素。默认情况下,priority_queue
是一个大顶堆,但是在这个声明中,通过使用 greater<int>
作为比较器,它被转换为一个一个小顶堆,即每次移除和访问的是队列中最小的元素。
vector<int>
是用于存储优先队列元素的底层容器,而 greater<int>
是一个函数对象,它定义了元素之间的比较方式。在这个例子中,greater<int>
会使得优先队列按照升序排列,即最小的元素在顶部。
这个声明的数组大小为 100010,这意味着你可以使用 h[0]
到 h[100009]
来访问数组中的每个优先队列。这在处理一些需要多个优先队列的问题时非常有用,例如在图论中的 Dijkstra 算法或者在某些数据结构中的多路归并问题。