なぜこれをやろうとしているのかについていくつかの文脈を述べますが、最終的には文脈は無視することができます.なぜなら、それは主に古典的なコンピュータサイエンスとC ++の問題だからです.何も起きなかった…)
私は (大規模な) リアルタイム ストリーミング ポイント クラウドを扱っており、複数のセンサーから 2/3/4 ポイント クラウドを取得し、それらを結合して 1 つの大きなポイント クラウドを作成する必要がある場合があります。私は、実際には 1 つの構造ですべてのデータが必要な状況にいますが、通常、点群を視覚化するだけの場合は、ビューアーに個別にフィードすることで回避できます。
私は Point Cloud Library 1.6 を使用しています。よく調べてみると、そのPointCloud クラス(<pcl/point_cloud.h>
興味がある場合は下) がすべてのデータ ポイントを STL ベクトルに格納しています。
今、バニラの CS ランドに戻ってきました...
PointCloud には、ある点群の内容を別の点群に追加するための += 演算子があります。ここまでは順調ですね。しかし、この方法はかなり非効率的です - 私が正しく理解していれば、1) ターゲット ベクトルのサイズを変更し、次に 2) 他のベクトルのすべてのポイントを実行し、それらをコピーします。
これは O(n) 時間の複雑さのケースのように見えます。通常はそれほど悪くないかもしれませんが、クラウドごとに少なくとも 300K ポイントをリアルタイムで処理する場合は悪いニュースです。
ベクトルをソートしたり分析したりする必要はなく、メモリ レベルで「くっつける」だけでよいため、プログラムは、最初のベクトルの最後に到達すると、最初のベクトルの開始位置にジャンプする必要があることを認識します。 2番目のもの。つまり、O(1) ベクトルのマージ方法を探しています。STLでこれを行う方法はありますか? それとも、std::list#splice のようなもののドメインですか?
注: このクラスは PCL のかなり基本的な部分であるため、「非侵襲的手術」が望ましいです。クラス自体に変更を加える必要がある場合 (ベクトルからリストへの変更、メモリの予約など)、PCL の残りの部分への影響を考慮する必要があり、広範囲に及ぶ可能性があります。
更新: PCL の GitHub リポジトリにイシューを提出し、以下の提案についてライブラリの作成者と議論するようにしました。どのアプローチを採用するかについて何らかの解決策が得られたら、関連する提案を回答として受け入れます。