私はWARCファイルを解析するためのC++ライブラリを作成しています.WARCレコードとフィールドデータを格納するクラスと、入力ストリームからデータを読み取る演算子を含んでいます。 istream
から読み取り、WARCRecord
オブジェクトに値を設定するには、operator>>
があります。 istream
ストリームから読み込み、WARCRecord
オブジェクトに解析することができます。しかし、入力ストリームからすべてのWARCレコードを読み取るためにistream_iterator
を使用したいと思います。istream_iteratorはオブジェクトを再利用しますか?
istream_iterator
を使用してストリームの最後まで繰り返すと、私のoperator>>
は最後の呼び出しの同じ(コピー?)オブジェクトを受け取ります。これは期待された動作ですか、私はクラス定義に演算子/コンストラクタがありませんか?
これは、この動作を確認するためのユニットテストを持つリポジトリのリンクである:このプログラムの出力は
#include <iostream>
#include <istream>
#include <sstream>
#include <vector>
#include <iterator>
class MyClass
{
public:
std::vector<unsigned int> fields;
friend std::istream& operator>> (std::istream& is, MyClass& obj);
};
std::istream& operator>> (std::istream& is, MyClass& obj){
std::istream::sentry s(is);
if (s) {
for (unsigned i = 0; i < 3; i++) {
unsigned f;
is >> f;
obj.fields.push_back(f);
}
}
return is;
}
int main(void)
{
std::stringstream ss;
ss << 1 << " " << 2 << " " << 3 << " " << 4 << " " << 5 << " " << 6;
std::istream_iterator<MyClass> it(ss);
std::cout << it->fields.size() << std::endl;
it++;
std::cout << it->fields.size() << std::endl;
return 0;
}
:
$ ./a.out
3
6
上記テキストを実証するための簡単な例
https://github.com/jvanz/libwarc
MyClass
オブジェクトのfields
メンバサイズの累積に注意してください。
を呼び出す前に、新しいオブジェクトを作成しません注意してください。したがって、実装は同じ内部オブジェクトを読み取りのたびに再利用し、逆参照すると返すことがあります – WhiZTiM
ここにコードを貼り付けます。それが[mcve] –