Hỏi về C++ cin.tie và cout.tie

Mọi người có thể giải thích giúp em 3 dòng này mà em làm trên ntucoder với codeforces họ hay viết:
ios_base::sync_with_stdio(false);
cin.tie(0) và cout.tie(0);
Cảm ơn mọi người đã dành thời gian cho topic <3

4 Likes

ios_base::sync_with_stdio(false);
Dùng cin/cout bình thường sẽ bất lợi về thời gian do phải đồng bộ với stdin/stdout (vì lí do lịch sử nên phải có đồng bộ này). Gặp bài I/O nhiều (tập lệnh này nọ, ma trận) phải có câu này, nếu I/O ít thì không đáng kể. Vì vậy hay thấy trong đua spoj / topcoder / …

cin.tie(0); để ngăn sự đồng bộ giữa cin và cout: chỉ khi cout xuất ra hết thì cin mới nhập vào (và ngược lại). Việc đồng bộ này chỉ có chương trình tương tác mới cần, còn chạy như spoj (hay script/batch …) thì không cần thiết.

27 Likes

cảm ơn anh vì lời giải thích, em đọc trên stack cũng hơi hơi hiểu cái này nhưng ko clear đc như hôm nay :3 thanks a lot

2 Likes

Vậy bạn đánh tick cho mình nhé :slight_smile:

2 Likes

ồ giờ mới để ý có cái tick giống stackoverflow :)))) từ trước rất ngại hỏi trên daynhauhoc :v hnay hỏi đc trả lời vui quá ^^

4 Likes

Cho em hỏi là trong khi thi HSG cấp tỉnh hoặc QG thì mình ko dùng cin/cout mà dùng ifstream/ofstream để nhập xuất file thì trong TH trên, mình có phải sửa lại mấy câu lệnh trên không hay khỏi cần dùng a?

Luồng file thì không cần phải tắt đồng bộ. sync_with_stdio là đồng bộ giữa luồng C (stdio) và C++ (cin/cout).

2 Likes

Vậy là mình chỉ cần dòng ios_base::sync_with_stdio(0); ở đầu hàm main thôi là đủ rồi ạ?

  • Nên để là false thay vì 0.
  • istream/ofstream là luồng file nên có hay không cũng vậy :slight_smile: không ảnh hưởng.
2 Likes

Cho em hỏi thêm là cụ thể việc đồng bộ giữa stdio và cin/cout có ý nghĩa gì ạ?
Và nếu mình tắt đồng bộ đi thì có gì khác so với khi chưa tắt không ạ?

Bạn đọc lại từ đầu nhé :slight_smile: mình trả lời ở trên rồi.

1 Like

Ý em không phải là về vấn đề thời gian chạy mà là cách hoạt động ấy anh? Tức là nếu tắt đồng bộ như thế thì cách hoạt động của cin/cout có khác gì so với khi chưa tắt ko ấy a5a? (biết chạy nhanh hơn nhưng em cũng chưa hiểu đồng bộ nghĩa là gì!)

C++ vừa có cstdio (của C) vừa có iostream :slight_smile:

Nếu không đồng bộ thì không rõ hai dòng sau xuất ntn:

cout >> "Hello!"
puts("Goodbye!"); //printf chỉ nên dùng khi cần định dạng

Với lệnh nhập thì còn nguy hiểm hơn, hai biến có thể lẫn với nhau, nhập “4 6” không biết x = 6 y = 4 hay x 4 y 6.

Nhìn rộng ra thì stdio và iostream có thể xài chung một buffer (!) nên phải đồng bộ.

Nhưng buffer thì liên quan gì? :smiley: Do thời gian (latency!) nhập xuất (I/O) rất lâu so với đọc ghi RAM, ta phải gom càng nhiều càng tốt vào buffer để ghi một lần xuống đĩa cứng hay màn hình. Nên hiểu rằng nhập xuất chuẩn (stdio và iostream) đều thông qua buffer, nên cout và puts không phải viết ngay ra màn hình.

6 Likes

bạn ơi, tie(NULL) với tie(0) có khác nhau ko ạ, nếu có thì khác nhau như nào ạ

Như nhau :smiley:

Vì phương thức tie (setter) có tham số là một con trỏ, mà khi số 0 được ép về kiểu con trỏ, trình biên dịch xem nó như NULL đều là null pointer.

A constant expression of type int with the value 0, or an expression of this type, cast to type void * is a null pointer constant, which if converted to a pointer becomes a null pointer. It is guaranteed by the standard to compare unequal to any pointer to any object or function.

Lưu ý không phải gán 0 vào 1 con trỏ bất kỳ là làm nó thành NULL được đâu.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?