std::vector中的pop-push元素和重用元素
pop-push element from std::vector and reuse elements
我在c++03中有一个项目的数据结构有问题:即使我必须连续pop_front-push_back,我也使用vector而不是list。但现在还可以,因为我现在需要重写太多的代码。
我的方法是too总是更新最后一帧大小点的缓冲区。所以每一帧我都必须向前弹出,然后向后推。(这种方法有名字吗?)
所以我使用这个代码:
Point apoint; // allocate new point
apoint.x = xx;
apoint.y = yy;
int size = points.size()
if (size > frame_size) {
this->points.erase( points.begin() ); // pop_front
}
this->points.push_back(apoint);
我有一些现成的对象池代码,所以我想:这不是一个很好的优化,但我可以将前端存储在池中,这样我就可以获得apoint的分配时间。
好吧,这没那么有用,可能也没什么意义,但我只是出于对教育的好奇而问:我怎么能做到这一点?
如何存储向量的已擦除元素的内存以供重用?这个问题有道理吗?如果没有,为什么?
因为擦除不会返回已擦除的矢量,所以它返回:
指向元素新位置的随机访问迭代器在函数调用擦除的最后一个元素之后如果操作擦除了序列
我有一些对象池的现成代码。。。我该怎么做?
使用矢量,你不能。向量将其元素存储在一个连续的数组中,因此不能一次分配一个元素,只能以任意大小的块分配。因此,不能将对象池用作std::vector
的分配器。
如何存储向量中已擦除元素的内存以供重用?这个问题有道理吗?如果没有,为什么?
矢量已经做到了。对erase
的调用将所有元素向下移动到第一个元素空出的空间中,在末尾留下一个空白空间来将新元素推入。
只要你使用一个向量,当你擦除第一个时,你就无法避免移动所有元素;如果效率太低,则使用deque
(或者可能使用list
)。
我不确定是否理解您想要做什么,但这在功能上应该与您所写的内容等效,而无需构建临时Point
实例:
// don't do this on an empty vector
assert (points.size() > 0);
// rotate elements in the vector, erasing the first element
// and duplicating the last one
copy (points.begin()+1, points.end(), points.begin());
// overwrite the last element with your new data
points.back().x = xx;
points.back().y = yy;
编辑:正如Mike Seymour在评论中指出的,这个解决方案和问题中提出的方法都不会导致任何新的内存分配。
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- lower_bound()返回最后一个元素
- C++ push() 和 pop() 方法使用指针的动态 LinkedList 的问题
- 模板堆栈类的复制构造函数中的 pop() 和 push() 不起作用
- 此C 链接列表/PUSH/POP程序的主要方法
- std::stack::push和std::stack:pop是线程安全的
- 使用Push、Pop等在C++中创建堆栈
- 在 C++ 中将元素添加到空向量:为什么 push.back 有效而 [] 无效
- std::vector中的pop-push元素和重用元素
- GCC上的#pragma-pack(push,n)/#pragma-pack(pop)和__attribute__((_
- 二维矩阵的Push和pop操作,并在c++中显示
- 对std::队列的pop和push操作使用单独的互斥锁,而不是一个互斥锁
- (Pop in Array Based Stack)是否删除元素?
- 数据结构-在C++中,如果没有pop()函数,我如何返回堆栈的第二个元素
- 不同的互斥锁用于push和pop