2017-04-19 9 views
0

今日はostream_iteratorの使用方法を学んだだけですが、これが通常のforループと比較して効率的かどうかはわかりません。ostream_iteratorは効率的ですか?

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

そして

、より効率的である1
//The second one 
vector<int> v = {1, 2, 3, 4, 5}; 
for (int i : v) cout << i << " "; 

:ここ

は、コードのですか?

ありがとうございます!

+3

ストリームを使用するのは、ほとんどの場合、特に基礎となるシステム( 'cout' /' cin'/'fstream'/...)とやり取りするときに効率が悪いので、両方の方法の違いは見えませんメソッドの「効率」はストリームの非効率性によって隠されます。 – Holt

+1

レンジベースのforループでは、わずかにタイピングが必要です。 –

+0

「効率的」を定義します。タイプされた文字の数のようないくつかの尺度によって、2番目の方がより効率的です。他の人(例えば、同じ 'ostream_iterator'を複数回使用してintの複数のベクトルを出力する能力)によって、最初のものが可能です。測定値がCPUサイクルまたはメモリ使用量の場合、結果はコンパイラの品質と標準ライブラリのコーディングによって異なります。だから、本当の答えは「それは依存している」ということです。 – Peter

答えて

1

std::copyは、イテレータからoperator=を使用しています。これは、この

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

    return (*this); 
} 

のようなものは、あなたが(整数をフォーマットして出力に比べてゼロ時間がかかります)、セパレータの条件付き出力を除いて、あなたのためのループを持っているコードと非常によく似ています見えます。