【问题标题】:vector of vector buffer c++向量缓冲区的向量 c++
【发布时间】:2016-05-17 08:29:33
【问题描述】:

对于我的应用程序,我需要创建一个固定大小的点云缓冲区(3 个元素)。
为此,我在回调中尝试了天真的方式(我正在研究 ROS):

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;



    }



}
}

但这种方式在我看来有点粗糙,根本没有效率。
有人可能会建议我用一种更优雅、更有效的方式来做我想做的事吗? 谢谢
问候

【问题讨论】:

  • 你可以使用 std::replace 方法,我认为它会更简洁

标签: c++ vector stl buffer


【解决方案1】:

解决一些效率问题。首先在声明temp 之后,您已经可以保留它将使用的内存

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

所以push_back方法中不会重新分配内存。

如果您使用的是 c++11 或更高版本,在缓冲区尚未满的情况下,您可以使用 std::move 移动 temp 的内容。

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

这是一个 O(1) 操作。在此之后temp的内容有效但未指定。

然后在删除最后一个元素时使用 vector::swap 而不是 copy,因为它会交换内容并保证在时间上保持不变。

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];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 2014-10-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    相关资源
    最近更新 更多