我将自定义图像对象类型存储在std :: vector中,并将该向量视为循环缓冲区。每个图像都有一个overwrite(...)方法,每次缓冲区循环时都会用新的内容(相同尺寸)将其重新初始化-我的问题是在“现代” C ++中(我已经在string_view中使用C ++ 17了)。这样的方式?
正在考虑在图像类上使用vector.emplace()和适当的构造函数的某种组合。或以某种方式使用新的展示位置。
[基本上,我想将所有图像初始化逻辑保留在构造函数中,而不是在构造函数和overwrite()之间分割,同时避免破坏和初始化新的内部缓冲区等的开销。
您要移动 the
新内容
到向量中的现有条目,因此“自定义图像”类中的移动分配运算符将有所帮助,例如g。:
class CustomImage
{
public:
CustomImage() = default;
CustomImage(std::vector<unsigned char>&& data)
: data_(std::move(data))
{}
// move assignment
CustomImage& operator=(CustomImage&&) = default;
private:
// possible way of storing image data
std::vector<unsigned char> data_;
};
然后您可以将新内容移动到环形缓冲区条目,如下所示:
// initialize the ring buffer with 5 empty entries
std::vector<CustomImage> ring_buffer(5);
// some new example image
std::vector<unsigned char> first_image{2,4,5,7,9};
// move assign the new image to the current entry in the ring buffer
ring_buffer.at(0) = std::move(first_image);
这是现代的(由于移动了语义)并且速度很快,因为未复制图像的内存。