在现代C ++中回收内部元素时有效地重新初始化/替换容器元素的惯用方式?

问题描述 投票:2回答:1

我将自定义图像对象类型存储在std :: vector中,并将该向量视为循环缓冲区。每个图像都有一个overwrite(...)方法,每次缓冲区循环时都会用新的内容(相同尺寸)将其重新初始化-我的问题是在“现代” C ++中(我已经在string_view中使用C ++ 17了)。这样的方式?

正在考虑在图像类上使用vector.emplace()和适当的构造函数的某种组合。或以某种方式使用新的展示位置。

[基本上,我想将所有图像初始化逻辑保留在构造函数中,而不是在构造函数和overwrite()之间分割,同时避免破坏和初始化新的内部缓冲区等的开销。

stl c++14 c++17
1个回答
0
投票

您要移动 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);

这是现代的(由于移动了语义)并且速度很快,因为未复制图像的内存。

© www.soinside.com 2019 - 2024. All rights reserved.