将一个向量的内存映射到另一向量

时间:2018-11-15 00:39:50

标签: c++ vector mapping

我有一些中间件使用的二进制数据向量

std::vector<uint> data

此向量内的数据基本上映射到类Foo上:

|uint|uint|uint|uint|uint|uint|uint|uint|uint|
|    F o o     |    F o o     |    F o o     |

使用自定义放置分配器(如此处Can I use an std::vector as a facade for a pre-allocated (raw) array?所述),我现在可以将第一个向量的内存映射到类型为std::vector<Foo>的向量

但是,如果我对第二个向量进行运算,则第一个向量的大小不会更新。

另一种方法是将第一个向量std::vector<uint8>封装在行为类似于std::vector<Foo>的自定义容器中,但这需要很多工作(我不能使用Boost)。

有什么好主意的想法吗?

1 个答案:

答案 0 :(得分:0)

情况与链接的问题完全不同。您无需处理预分配的存储,而已有对象的数据。此外,您希望双方都可以修改矢量,或者换句话说,他们拥有共享所有权。

这不是小事。您可以提供一个“视图类”,该“视图类”在同一向量上提供另一组操作,或者让一组自由函数执行相同的操作。无论哪种方式,它们都必须具有引用语义。

免费功能示例

template<typename T>
void push_back_foo(std::vector<uint8_t>& vec, T&& t)
{
    auto it = vec.insert(vec.end(), sizeof(Foo), {});
    new (&*it) Foo{std::forward<T>(t)};
}

对于所有其他功能,依此类推。它们将Foo端的操作映射到uint8_t端的操作。

一个旁注:对结果向量进行指针算术是形式上未定义的行为,因为那里没有Foo的数组。在处理带有立面的二进制数据时,通常可以理解,编译器不会烧毁您的房屋,并且此类形式会被忽略。