Condividi tramite


Algoritmi (C++ moderno)

Per la programmazione C++ moderna, è consigliabile utilizzare gli algoritmi della Libreria di modelli standard. Ecco alcuni esempi importanti:

  • for_each, che è l'algoritmo di attraversamento predefinito. (Anche transform per la semantica non-sul-posto).

  • find_if, che è l'algoritmo di ricerca predefinito.

  • sort, lower_bound e altri algoritmi di ordinamento e di ricerca predefiniti.

Per scrivere un confronto, utilizzare strict < e utilizzare espressioni lambda denominati quando possibile.

auto comp = []( const widget& w1, const widget& w2 )
      { return w1.weight() < w2.weight(); }

sort( v.begin(), v.end(), comp );

auto i = lower_bound( v.begin(), v.end(), comp );

Loops

Quando possibile, utilizzare cicli for basati su intervallo o chiamate dell'algoritmo, o entrambe le opzioni, anziché i cicli scritti a mano. copy, transform, count_if, remove_if e altri simili ad essi sono notevolmente migliori dei cicli scritti a mano perché il loro scopo è ovvio e semplificano la scrittura del codice esente da errore. Inoltre, molti algoritmi STL includono ottimizzazioni dell'implementazione che li rendono più efficienti.

Anziché il precedente codice C++ simile al seguente:

for( auto i = strings.begin(); i != strings.end(); ++i ) {
  :::
  :::
}

auto i = v.begin();

for( ; i != v.end(); ++i ) {
  if (*i > x && *i < y) break;
}

Utilizzare il linguaggio C++ moderno come segue:

for_each( begin(strings), end(strings), []( string& s ) {
  :::
  :::
} );
auto i = find_if( begin(v), end(v),  [=](int i) { return i > x && i < y; }  );

Cicli for basati su intervallo

Il ciclo for basato su intervallo è una funzionalità del linguaggio C++ 11, non un algoritmo STL. Ma merita di essere menzionato in questa discussione sui cicli. I cicli for basati su intervallo sono un'estensione della parola chiave for e rappresentano un metodo pratico ed efficace per scrivere cicli che scorrono un intervallo di valori. I contenitori, le stringhe e le matrici STL sono pronti all'uso con i cicli for basati su intervallo. Per abilitare questa nuova sintassi di iterazione per il tipo definito dall'utente, aggiungere il supporto seguente:

  • Un metodo begin che restituisce un iteratore all'inizio della struttura e un metodo end che restituisce un iteratore alla fine della struttura.

  • Supporto dell'iteratore per questi metodi: operator*, operator!= e operator++ (versione prefisso).

Questi metodi possono essere funzioni membro o autonome.

Numeri casuali

Non è segreto che la funzione CRT rand() precedente presenti molti difetti, che sono stati trattati ampiamente dalla community di C++. In C++ moderno, non è necessario gestire tali aspetti negativi, né definire il proprio generatore di numeri casuali distribuito uniformemente, poiché gli strumenti per crearli rapidamente e in modo semplice sono disponibili nella libreria STL, come illustrato in <random>.

Vedere anche

Altre risorse

C++ (C++ moderno)

Riferimenti del linguaggio C++

Riferimento per la libreria standard C++