@Fred Nurk ha già pubblicato un link alla lista dei libri, quindi non cercherò di entrare nei dettagli, ma prenderei in considerazione C ++ accelerato il primo libro di quella lista per studiare da .
Come per un esempio, consideriamo un programma abbastanza semplice: una versione semplificata del comando standard "sort" di Unix. Per mantenere il codice breve (ma comunque almeno un po 'interessante), facciamolo funzionare come un filtro e produca risultati approssimativamente equivalenti a sort -u
. In C con codice di tipo Classes, in genere potresti vedere qualcosa in questo ordine:
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
const int max_lines = 1024 * 1024; // allow up to one megaline of input.
int sort_func(void const *a, void const *b) {
return strcmp(*(char const **)a, *(char const **)b);
}
int main() {
char buffer[1024];
char **lines;
unsigned current_line = 0;
lines = new char *[max_lines];
while (cin.getline(buffer, sizeof(buffer))) {
char *temp = new char[strlen(buffer) + 1];
strcpy(temp, buffer);
lines[current_line++] = temp;
if (current_line == max_lines)
break;
}
qsort(lines, current_line, sizeof(lines[0]), sort_func);
cout << lines[0];
for (int i=1; i<current_line; i++)
if (strcmp(lines[i], lines[i-1]))
cout << lines[i] << "\n";
for (int i=0; i<current_line; i++)
delete [] lines[i];
delete lines;
return 0;
}
Ora, questo non è un particolare codice terribile (se fossi del tutto onesto, probabilmente lo renderei peggiore). Passa la dimensione del buffer a getline
, quindi il buffer non si sovrapporrà. Quindi assegna un buffer per una linea, copia i dati nel buffer e passa a quello successivo. Controlla anche la fine del file correttamente, ecc.
Paragoniamolo a come probabilmente scriverei il codice in C ++:
#include <iostream>
#include <iterator>
#include <set>
#include <string>
class line {
std::string data;
public:
operator std::string() const { return data; }
friend std::istream &operator>>(std::istream &is, line &l) {
return std::getline(is, l.data);
}
};
int main() {
std::set<std::string> lines((std::istream_iterator<line>(std::cin)),
std::istream_iterator<line>());
std::copy(lines.begin(), lines.end(),
std::ostream_iterator<std::string>(std::cout, "\n"));
return 0;
}
Questa versione è chiaramente un po 'più breve. Abbiamo anche eliminato la maggior parte dei limiti fissi come la lunghezza massima della linea e il numero massimo di linee. Ancora più importante, tuttavia, non contiene loop espliciti: il loop di input viene gestito implicitamente nel costruttore per il set e il ciclo di output viene gestito nella chiamata a copy
. L'ordinamento e l'eliminazione dei duplicati è implicito nella definizione di set.