私はC++とデータ構造に不慣れで、最近傍を近似するコードがあり、そのためにC++でKdツリーを実装しました。
私の質問は、kdツリーをファイルに書き込む方法とそのファイルから読み取る方法を教えてください。
助けてくれてありがとう
boost::serializationを参照してください。プレーンテキスト、xml、バイナリなど、いくつかの出力形式から選択できます
C++ を初めて使用する場合は、何が必要なのかを正確に理解し、正しく簡単な方法で実装するだけで済みます。したがって、ブーストの依存関係は必要ありません。最初は、kd-tree はオブジェクトへのポインターを格納し、それらを所有していない可能性があります。実際にオブジェクトを所有する (オブジェクトの寿命に責任がある) 構造体を介してダンプ/ロードすることを検討してください。これにより、重複やリークを回避できます。次に、通常、ツリーはファイルに保存されず、ジオメトリをロードするたびに作成されます。これは、オブジェクトの配列だけでなく、より多くのストレージが必要であり、個別に追跡する必要がある重複を含めることができるためです。これにより、オブジェクトの所有者がわかった場合、読み取り/書き込み手順は次のようになります
int main(int argc, char** argv) {
std::string filename = "geometty_dump.txt"
if (argc == 2) { // filename explicitly provided
filename = *argv[1];
}
ProblemDriver driver; // stores geometry owner\owners
bool res = driver.GetGeometry(filename);
if (res) res = driver.SolveProblem();
if (res) res = driver.DumpGeometry();
return res;
}
幾何学的データ自体にアクセスする場所 ( などdouble x, y;
) を含める必要があり<iostream>
ます。質問がそれに関するものである場合は、C++ i\o について何かを読んでみてください。x、y を所有するオブジェクトには、フレンド対応関数が必要です
ostream& operator<< (ostream out&, const MyPoint& point) {
out << point.x() << point.y() << '\n';
}
ostream& operator>> (istream in&, MyPoint& point) {
double x, y;
in >> x >> y;
point.set(x, y);
}
これらの関数を呼び出すメソッド ( 、 )で作成しofstream
、それぞれ作成することを意味します。ifstream
ProblemDriver
GetGeometry
DumpGeometry