Χίλια συγγνώμη που άργησα τόσο να απαντήσω. Η ερώτησή σου επιδέχεται πολλές απαντήσεις, ανάλογα με το στόχο τον οποίο έχεις θέσει.
Μπορώ να σκεφτώ τα εξής πράγματα που αξίζει να συζητηθούν: Ταχύτητα εκτέλεσης, καθαρότητα κώδικα, δυνατότητα επέκτασης των συναρτήσεων, και τέλος εάν αξίζει να αλλάξεις τη μέθοδο την οποία ήδη χρησιμοποιείς.
A) Ταχύτητα.
- Η freopen έχει αμελητέα διαφορά στην ταχύτητα, όχι μόνο για τα πλαίσια του διαγωνισμού, αλλά γενικά. Οπότε χρησιμοποίησέ την άφοβα αν σε βολεύει.
- Οι scanf/printf είναι αισθητά ταχύτερες από τις cin/cout, ίσως μέχρι και πέντε φορές ταχύτερες. Παρόλα αυτά αν χρησιμοποιήσεις την εντολή sync_with_stdio(false), τότε είναι ίδιας ταχύτητας.
- Το ταχύτερο που μπορείς να χρησιμοποιήσεις, είναι να γράψεις μία δικιά σου συνάρτηση που διαβάζει ένα ένα τους χαρακτήρες και συνθέτει τον ακέραιο. Το σκεπτικό, στο περίπου, είναι ότι διαβάζεις ένα ψηφίο, μετά πολλαπλασιάζεις με δέκα, διαβάζεις το επόμενο και το προσθέτεις, και ξανά και ξανά... κάπως έτσι:
Κώδικας: Επιλογή όλων
#define gc getchar_unlocked
int read_int() {
char c = gc();
while(c<'0' || c>'9') c = gc();
int ret = 0;
while(c>='0' && c<='9') {
ret = 10 * ret + c - 48;
c = gc();
}
return ret;
}
Με αντίστοιχη λογική, χρησιμοποιώντας την εντολή putchar_unlocked() αντί για getchar_unlocked(), μπορείς να τυπώσεις γρήγορα.
Σημειώσεις περί ταχύτητας: Στους σοβαρούς διαγωνισμούς δεν παίζει ποτέ τόσο ρόλο το διάβασμα, οπότε μη χρησιμοποιείς την δική σου συνάρτηση. Χρησιμοποίησε όποια από τις scanf/cin προτιμάς, και αν σε βολεύει βάλε και freopen. Στον πραγματικό κόσμο, και πάλι θα χρησιμοποιείς έτοιμες συναρτήσεις. Μπορεί να μην είναι οι scanf/cin, αλλά κάποια ειδικά διαμορφωμένη από την εταιρεία για την οποία δουλεύεις, αλλά γενικά δεν αξίζει τον κόπο το τόσο παλαβό I/O.
Β) Καθαρότητα κώδικα
Ίσως λίγο πιο καθαρό το cin/cout, αλλά επίσης δε δίνει τόσο απλά τη δυνατότητα να κάνεις τη μορφοποίηση όπως θέλεις. Επιπλέον για να πετύχεις ίδια ταχύτητα πρέπει να θυμηθείς την εντολή με το sync_with_stdio(false) που έγραψα παραπάνω. Εγώ προτιμώ scanf/printf. Σίγουρα η δική μας συνάρτηση είναι η πιο δυσανάγνωστη, και πιθανώς να έχει και bugs!
Γ) Επεκτασιμότητα
Η cin/cout μπορεί να προσαρμοστεί ώστε να διαβάζει/τυπώνει πιο σύνθετες structs. Σίγουρα αυτό δε θα το χρειαστείς σε διαγωνισμό, όμως σε πραγματική δουλειά ίσως είναι χρήσιμο.
Δ) Να αλλάξω μέθοδο;
Όχι, παρά μόνο αν ο ίδιος νιώθεις ότι κάπου σε περιορίζει. Είναι απείρως σημαντικότερο, τόσο στο διαγωνισμό όσο και σε εταιρείες, να νιώθεις άνετα με αυτό που χρησιμοποιείς, καθώς αυτό ελαχιστοποιεί την πιθανότητα σφαλμάτων. Πίστεψέ με, είναι δραματικά σημαντικότερη η έλλειψη σφαλμάτων από το να κερδίσεις κάτι ψιλά σε ταχύτητα.
Ελπίζω να απάντησα σε ό,τι σε απασχολούσε, αν έχεις κάποια άλλη απορία, ενημέρωσε.