3

char 配列を ostream に送信する必要があります。次の印刷機能があるとします。

バージョン 1:

void print(ostream &out, const char *str, unsigned len)
{
    out << string(str,len);
}

バージョン 2:

void print(ostream &out, const char *str, unsigned len)
{
    out.write(str,len);
}

上記の両方のバージョンは、ある程度機能します。バージョン 1 は余分な文字列オブジェクトを作成するため (メモリの割り当てとデータのコピーが発生します)、あまり効率的ではないように見えます。

ただし、バージョン 2 では書式設定の可能性がなくなります。次の例では、バージョン 1 がうまく機能します (つまり、io マニピュレータは幅を 10 に設定し、それを次の出力フィールドに適用します)。

out << setw(10);
print(out,s,slen);

V1 のように機能を維持する方法はありますが、割り当て/メモリコピーに追加料金を支払う必要はありませんか?

4

2 に答える 2

0

次のように、 boost::iterator_rangeを使用してコピーを停止できます。

out << boost::iterator_range<const char*>(str, str + len);

ストリームに挿入されるタイプに基づいているため、フォーマットに影響を与えることはできないと思います。

于 2015-02-18T21:44:27.800 に答える