2016-05-17 15 views
0

für meine Anwendung muss ich eine feste Größe Puffer (3 Elemente) von Punktwolken erstellen.
Um dies zu tun ich die naive Art und Weise in meinem Rückruf versucht (Ich arbeite an ROS):Vektor Vektor Puffer 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; 



    } 



} 
} 

Aber so scheint mir ein wenig rau und überhaupt nicht effizient.
Könnte mir jemand eine elegantere und effizientere Art vorschlagen, was ich will? Danke
Grüße

+0

Sie verwenden können, implementieren könnte std :: ersetzen Methode ich denke, es wird mehr coppmactly –

Antwort

1

Um einige Effizienzprobleme zu beheben. Erst nach Erklärung temp können Sie bereits den Speicher reservieren sie mit

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

verwenden So wird es in push_back Verfahren keine Neuzuweisung von Speicher sein.

Wenn Sie C++ 11 oder höher verwenden, können Sie den Inhalt des Temps mit std::move verschieben, falls der Puffer noch nicht voll ist.

points_buffer.push_back(std::move(temp)); 

Dies ist eine O (1) -Operation. Der Inhalt von temp ist danach gültig, aber nicht spezifiziert.

Dann in das Löschen des letzten Elements verwenden Sie vector :: swap statt Kopie, da es den Inhalt tauschen wird und garantiert in der Zeit konstant zu sein.

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. 

Das Programm wäre besser lesbar, wenn Sie point_buffer in einer Klasse umhüllen würden. Dann könnten Sie auch in Betracht ziehen, den Inhalt des gesamten Vektors nicht zu rotieren, sondern den ersten Index im Auge zu behalten. Dies würde gut funktionieren, auch für größere point_buffer als 3. Dann neues Element hinzugefügt würde nur

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

dann, um das Element in Position zu puffern sein i Sie die operator[] als

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

Vielen Dank für Ihre Vorschläge! –