2017-04-19 3 views
0

Ich habe gerade gelernt, wie man heute ostream_iterator verwendet, aber ich weiß nicht, ob dies im Vergleich zu den normalen for-Schleife Weg effizient ist. HierIst ostream_iterator effizient?

ist der Code:

//The first one 
vector<int> v = {1, 2, 3, 4, 5}; 
ostream_iterator<int> osit(cout, " "); 
copy(v.begin(), v.end(), osit); 

Und

//The second one 
vector<int> v = {1, 2, 3, 4, 5}; 
for (int i : v) cout << i << " "; 

Welches ist effizienter?

Vielen Dank im Voraus!

+3

Die Verwendung von Stream ist meistens ineffizient, besonders wenn Sie mit dem zugrundeliegenden System interagieren ('cout' /' cin'/'fstream'/...), so dass Sie zwischen beiden Möglichkeiten keinen Unterschied sehen Die "Effizienz" der Methoden wird durch die Ineffizienz des Stroms verdeckt. – Holt

+1

Die forwarded-for-Schleife erfordert etwas weniger Typisierung. –

+0

Definieren Sie "effizient". Durch einige Maßnahmen (wie die Anzahl der eingegebenen Zeichen) kann die zweite effizienter sein. Durch andere (z. B. die Fähigkeit, denselben "ostream_iterator" mehr als einmal zu verwenden, um mehrere Vektoren von int auszugeben) kann der erste sein. Wenn Ihr Maß CPU-Zyklen oder Speichernutzung ist, hängen die Ergebnisse von der Qualität des Compilers und der Codierung der Standardbibliothek ab. Die wirkliche Antwort ist also "es kommt darauf an". – Peter

Antwort

1

std::copy verwendet operator= aus dem Iterator. Es sieht so etwas wie dieses

ostream_iterator& operator=(const _Ty& _Val) 
{ // insert value into output stream, followed by delimiter 
    *_Myostr << _Val; 
    if (_Mydelim != 0) 
    { 
     *_Myostr << _Mydelim; 
    } 

    return (*this); 
} 

sieht sehr ähnlich dem Code, den Sie haben in Ihrer for-Schleife, mit Ausnahme der bedingten Ausgabe des Separators (die Formatierung der ganzen Zahl verglichen Null Zeit in Anspruch nimmt und zu dessen Ausgabe).