This shows you the differences between two versions of the page.
pa:tutoriale:coding-tips [2024/03/06 21:18] andrei.preda3006 Change the title a bit. |
pa:tutoriale:coding-tips [2024/03/06 21:21] (current) andrei.preda3006 Add some whitespace. |
||
---|---|---|---|
Line 23: | Line 23: | ||
fout << answer; | fout << answer; | ||
</code> | </code> | ||
+ | |||
Când citiți **de la tastatură**, puteți dezactiva sincronizarea dintre stream-urile C++ și cele din C cu funcția ''[[https://en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio|std::ios::sync_with_stdio]]''. Sincronizarea există pentru cazul în care vreți să folosiți atât ''%%std::cin%%'' / ''%%std::cout%%'' cât și ''%%scanf%%'' / ''%%printf%%'' în același program, ceea ce oricum nu este recomandat. Dezactivarea aduce un plus de viteză. | Când citiți **de la tastatură**, puteți dezactiva sincronizarea dintre stream-urile C++ și cele din C cu funcția ''[[https://en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio|std::ios::sync_with_stdio]]''. Sincronizarea există pentru cazul în care vreți să folosiți atât ''%%std::cin%%'' / ''%%std::cout%%'' cât și ''%%scanf%%'' / ''%%printf%%'' în același program, ceea ce oricum nu este recomandat. Dezactivarea aduce un plus de viteză. | ||
Line 31: | Line 32: | ||
} | } | ||
</code> | </code> | ||
+ | |||
Pentru a citi o linie întreagă într-un șir de caractere, puteți folosi funcția ''%%std::getline%%'': | Pentru a citi o linie întreagă într-un șir de caractere, puteți folosi funcția ''%%std::getline%%'': | ||
Line 37: | Line 39: | ||
std::getline(std::cin, line); | std::getline(std::cin, line); | ||
</code> | </code> | ||
+ | |||
==== Folosiți biblioteca standard ==== | ==== Folosiți biblioteca standard ==== | ||
Line 67: | Line 70: | ||
} | } | ||
</code> | </code> | ||
+ | |||
De asemenea, codul **nu** devine mai încet de obicei dacă returnați containere din funcții, pentru că se copiază doar pointer-ul către zona unde e stocat conținutul, nu elementele în sine. Ca stil de programare e încurajat, pentru că face scopul funcției mai clar. | De asemenea, codul **nu** devine mai încet de obicei dacă returnați containere din funcții, pentru că se copiază doar pointer-ul către zona unde e stocat conținutul, nu elementele în sine. Ca stil de programare e încurajat, pentru că face scopul funcției mai clar. | ||
Line 84: | Line 88: | ||
} | } | ||
</code> | </code> | ||
+ | |||
Dacă alegeți să alocați singuri memorie, folosiți operatorii din C++ (''%%new%%'', ''%%delete%%'' și ''%%delete[]%%''), nu funcțiile din C. | Dacă alegeți să alocați singuri memorie, folosiți operatorii din C++ (''%%new%%'', ''%%delete%%'' și ''%%delete[]%%''), nu funcțiile din C. | ||
Line 95: | Line 100: | ||
int Solve(const vector<int>& vec); // Se copiază un pointer, și nu am voie să modific. | int Solve(const vector<int>& vec); // Se copiază un pointer, și nu am voie să modific. | ||
</code> | </code> | ||
+ | |||
Ca //rule of thumb//, obiectele ar trebui pasate mai mereu folosind referințe. Referința constantă semnifică faptul că parametrul este //read-only//, pe când referința ne-constantă e folosită doar dacă vrem să transmitem un răspuns către exterior prin acea variabilă. Mecanismul de a pasa un container prin copiere (fără referință) e util dacă vrem să modificăm containerul în funcție, dar nu vrem să fie vizibile modificările în exterior. | Ca //rule of thumb//, obiectele ar trebui pasate mai mereu folosind referințe. Referința constantă semnifică faptul că parametrul este //read-only//, pe când referința ne-constantă e folosită doar dacă vrem să transmitem un răspuns către exterior prin acea variabilă. Mecanismul de a pasa un container prin copiere (fără referință) e util dacă vrem să modificăm containerul în funcție, dar nu vrem să fie vizibile modificările în exterior. | ||
Line 106: | Line 112: | ||
); | ); | ||
</code> | </code> | ||
+ | |||
==== Setați din start dimensiunea vectorilor dacă o cunoașteți ==== | ==== Setați din start dimensiunea vectorilor dacă o cunoașteți ==== | ||
Line 121: | Line 128: | ||
vec3.push_back(2); | vec3.push_back(2); | ||
</code> | </code> | ||
+ | |||
==== Nu folosiți std::endl ==== | ==== Nu folosiți std::endl ==== | ||
Line 134: | Line 142: | ||
Clasa ''%%Scanner%%'' din Java nu face buffering, ceea ce poate încetini programul. Din acest motiv recomandăm să folosiți o clasă custom. Clasa de mai jos are o interfață asemănătoare cu ''%%Scanner%%'', așa că nu trebuie să schimbați mult programul pentru a o folosi. | Clasa ''%%Scanner%%'' din Java nu face buffering, ceea ce poate încetini programul. Din acest motiv recomandăm să folosiți o clasă custom. Clasa de mai jos are o interfață asemănătoare cu ''%%Scanner%%'', așa că nu trebuie să schimbați mult programul pentru a o folosi. | ||
- | |||
- | <HTML> | ||
- | <!-- Should be collapsible, it's very long. --> | ||
- | </HTML> | ||
<code java> | <code java> | ||
Line 200: | Line 204: | ||
} | } | ||
</code> | </code> | ||
+ | |||
===== Independent de limbaj ===== | ===== Independent de limbaj ===== | ||
Line 224: | Line 229: | ||
int answer = (((1LL * a + b) % kMod) * (big % kMod)) % kMod; | int answer = (((1LL * a + b) % kMod) * (big % kMod)) % kMod; | ||
</code> | </code> | ||
+ | |||
<code java> | <code java> | ||
// Java | // Java | ||
Line 235: | Line 241: | ||
int answer = (int) (((1L * a + b) % MOD * (big % MOD)) % MOD); | int answer = (int) (((1L * a + b) % MOD * (big % MOD)) % MOD); | ||
</code> | </code> | ||
+ | |||
Important: **operația de împărțire nu are aceleași proprietăți ca adunarea, înmulțirea etc.**, trebuie să folosim noțiunea de //invers modular// în cazul ei. | Important: **operația de împărțire nu are aceleași proprietăți ca adunarea, înmulțirea etc.**, trebuie să folosim noțiunea de //invers modular// în cazul ei. | ||