首先,我使用std::ios_base::sync_with_stdio(false)
。以下是从文本文件 (<input.txt >output.txt
) 读取一百万个整数的代码:
int tests;
cin >> tests;
for (int i = 0; i < tests; ++i) {
int number;
cin >> number;
cout << number << "\n";
}
并且
int tests;
cin >> tests;
vector<int> numbers(tests);
for (int i = 0; i < tests; ++i) {
cin >> numbers[i];
}
for (int i = 0; i < tests; ++i) {
cout << numbers[i] << "\n";
}
当然,在现实中,它们不仅仅是打印相同的数字。问题在于,第一个块需要的时间大约是第二个块的4倍(6.2秒对比1.8秒)。
使用printf
/scanf
重写相同的代码,在两种情况下都只需要3秒钟。这背后的原因是什么?
cin
和cout
是tie()
ed的。对其中一个进行操作会调用另一个的flush()
方法。 - Igor Tandetniksync_with_stdio
不是为了防止这种情况吗? - rivcout
е’Ңprintf
д№Ӣй—ҙзҡ„иҒ”зі»гҖӮиҖҢдёҚжҳҜcout
е’Ңcin
д№Ӣй—ҙзҡ„иҒ”зі»гҖӮ - Igor Tandetnikcin.tie(NULL)
确实有帮助。好的,这很好知道 >.> - rivsync_with_stdio
确保std::cout
和stdout
的输出不会混合。tie()
确保任何对std::cout
的输出都会在尝试从std::cin
读取之前出现(粗略地说,在这种情况下)。换句话说,如果您正在交互式地输出提示,然后输入,您不需要显式刷新(如果输出是到stdout
,并且输入来自stdin
,则需要刷新)。 - James Kanze