Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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.
  
pa/tutoriale/coding-tips.1709752687.txt.gz · Last modified: 2024/03/06 21:18 by andrei.preda3006
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0