2016-05-17 2 views
0
私のアプリケーションのための

私はポイントクラウドの固定サイズのバッファ(3要素)を作成する必要があります。
は、私は(私はROSに取り組んでいる)私のコールバックで素朴な方法を試してみましたこれを行うには:ベクトルバッファのベクトルC++

vector< vector<Point2d> > points_buffer(3); // buffer of point clouds ,fixed size = 3 
void laserToWorldCallback(const icars_laser_roi::stx_points::ConstPtr& laser_points, const icars_2d_map_manager::Status::ConstPtr& car_pos){ 

double x_w, y_w; 
double x, y; 
vector<Point2d> temp; 

    for(int i = 0; i < laser_points->points_x.size(); i++){ 
     // get the coordinates 
     x = laser_points->points_x[i]; 
     y = laser_points->points_y[i]; 

     // tranform the coordinates 

     x_w = car_pos->xGlobal + x*cos(car_pos->yaw) - y*sin(car_pos->yaw); 
     y_w = car_pos->yGlobal + x*sin(car_pos->yaw) + y*cos(car_pos->yaw); 

     temp.push_back(Point2d(x_w, y_w)); 

    } 

    if(points_buffer.size() != 3){ // the buffer is not empty 
     points_buffer.push_back(temp); 
    }else{ // the buffer is empty, delete last element and push_back 

     // delete last element 
     points_buffer[0] = points_buffer[1]; 
     points_buffer[1] = points_buffer[2]; 
     points_buffer[3] = temp; 



    } 



} 
} 

しかし、この方法は私には少し荒いようではなく、効率的ですべて。
誰かが私にしたいと思うよりエレガントで効率的な方法を提案するかもしれませんか? ありがとうございます
よろしくお願いします

+0

を実装することができた位置にある要素にアクセスすることであろうstd :: replace method私はそれがもっとcopmpactlyになると思います –

答えて

1

いくつかの効率の問題を修正します。まずtempの宣言の後、あなたはすでにそれがそうpush_back方法でメモリのない再割り当ては行われません

temp.reserve(laser_points->points_x.size()); 

で使用するメモリを予約することができます。

C++ 11以上を使用している場合、バッファがいっぱいになっていない場合は、std::moveで一時的な内容を移動することができます。

これはO(1)操作です。この後のtempの内容は有効ですが、指定されていません。

最後の要素を削除するには、コピーの代わりにvector :: swapを使用します。これは、コンテンツをスワップするため、時間的に一定であることが保証されています。

points_buffer[0].swap(points_buffer[1]); 
points_buffer[1].swap(points_buffer[2]); 
points_buffer[2].swap(temp); //There is a typo here index should be 2 not 3. 

point_bufferをクラスにラップすると、プログラムが読みやすくなります。その後、ベクトル全体の内容を回転させずに最初のインデックスを追跡することもできます。これは3より大きいpoint_bufferにもうまくいくでしょうそして、バッファリングするために新しい要素を追加するだけで

point_buffer[fist_element_].swap(temp); 
first_element=(first_element_+1)%3; 

その後iあなたが使用することができますoperator[]

vector<Point2d>& operator[](int i){ 
    return point_buffer[(i+first_element)%3]; 
} 

として
+0

あなたの提案に感謝! –