15

したがってistringstream、初期化時に文字列の内容をコピーします。

string moo("one two three four");
istringstream iss(moo.c_str());

ものをコピーせずにstd::istringstream、指定されたをバッファーとして使用する方法があるかどうか疑問に思っていました。このように、引数として取る関数c_strに渡す前に大量のメモリをコピーする必要はありません。std::istringstream&istream&

私がやろうとしているのは、std::ifstream&引数を取るだけのいくつかの関数 (それらはほとんどパーサーです) をistream&同様に取るように変換することです。このために独自のistreamサブクラスを作成する必要がありますか?

4

5 に答える 5

9

を使用するistringstreamと、バッファ全体がコピーされるため、満足のいく解決策ではありません。

以前の回答は deprecatedistrstreamを示唆していますが、これは警告を生成し、将来削除される可能性があるため、より良い解決策はboost::iostreamsを使用することです:

boost::iostreams::stream<boost::iostreams::array_source> stream(moo.c_str(), moo.size());

これにより、同じ方法でバッファをコピーする必要がなくなりistrstream、独自のストリーム クラスを作成する必要がなくなります。

于 2016-06-08T21:02:01.463 に答える
5

std::streambuf特定のメモリ領域から読み取る基本的なクラスを作成するのは非常に簡単です。次に、これから構築し、istreamそこから読み取ることができます。

インメモリバッファから C++ std::istringstream を初期化していますか?

ただし、指定されたバッファの有効期間c_str()は非常に限られていることに注意してください。また、 c_str()want の呼び出しによって何らかのコピーが発生するという保証はありませんが、それが行われる実装については知りません。

于 2010-06-26T09:21:45.813 に答える
3

非推奨のistrstreamはこの機能をサポートしています。

#include <string>
#include <strstream>
using namespace std;

int main(int argc, char* argv[])
{
    string moo = "one two three four";
    istrstream istr(const_cast<char*>(moo.c_str()),moo.size());
    std::string line;
    while(!istr.fail() && !istr.eof()){
        getline(istr,line,' ');
        cout << line << "_";
    }
    // prints: one_two_three_four_
}
于 2010-06-26T09:03:42.267 に答える
2

渡すパラメーター a は、 istringstream コンストラクターconst char*の引数の型に変換する必要があるため、コピーしかありません。

stringを呼び出さずに渡すだけc_str()です。

istringstream iss(moo);

わかりました。これでコピーが完全に防止されるわけではありませんが、不要なコピーが排除されます。コピーを完全に削除するには、 を書き換える必要があります。std::stringbufこれにより、指定した を直接操作することが特に回避されstringます。

于 2010-06-26T06:36:33.697 に答える
2

std::string が何をするかによって異なります。27.2.1/1 によるとThe class basic_istringstream<charT,traits,Allocator> ... uses a basic_stringbuf<charT,traits,Allocator> object to control the associated storage. 、クラスはオブジェクトを使用する必要があるため、文字列をそのオブジェクトにコピーする必要があります。

したがって、本当の問題はstringstream、コンテンツをコピーするかどうかではなく、文字列を作成するコピーがコンテンツをコピーするか、ある種のコピー オン ライト スキームを実装するかどうかです。

于 2010-06-26T06:46:07.217 に答える