This shows you the differences between two versions of the page.
|
pa:tutoriale:coding-tips [2024/03/06 21:18] andrei.preda3006 First version |
pa:tutoriale:coding-tips [2024/03/06 21:21] (current) andrei.preda3006 Add some whitespace. |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Detalii de implementare ====== | + | ====== Sfaturi pentru implementare ====== |
| Aceasta este o listă cu sfaturi / bune practici / idei de optimizare care vă pot ajuta când rezolvați probleme la PA. Acoperă aspecte legate de performanță, dar și de //coding style// sau convenții respectate de comunitatea de programatori. | Aceasta este o listă cu sfaturi / bune practici / idei de optimizare care vă pot ajuta când rezolvați probleme la PA. Acoperă aspecte legate de performanță, dar și de //coding style// sau convenții respectate de comunitatea de programatori. | ||
| 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. | ||