c++ - 可以容纳任何 POD 的 vector

标签 c++ vector c++11

是否有一种载体可以容纳任何 POD?像这样的东西:

anyvector v;
v.push_back<int>(1);
v.push_back<somestruct>({1, 2, 3});

并通过以下方式访问它:

int a = v.get<int>(0);
somestruct b = v.get<somestruct>(1);

我知道保存每个元素的偏移量肯定有开销,但应该小于vector<boost::any>的开销这是我目前的解决方案。
我需要的操作是插入到末尾,从末尾移除和随机访问。
我知道实现一个不是问题,只是问是否有现成的。

编辑:使用指针存储数据(boost::anyboost::variant)的解决方案比使用线性存储的开销大,这正是我正在寻找的。

最佳答案

我从没听说过,如果有的话我会很惊讶,因为 非常特别。但是,实现起来应该不会太难, 使用两个 vector ,一个 std::vector<unsigned char>对于原始内存 你放东西的地方,和std::vector<size_t>映射索引。 只要它只包含 POD,您就可以使用 memcpy插入 元素。只是不要忘记尊重对齐。那指数 数组映射索引:不要尝试将指针放入其中,因为它们会 以后被无效push_back .

就此而言,实现一个拥有 任何类型,甚至是非 POD,使用 placement new 和显式销毁。 唯一真正的问题是对齐。当你插入 vector,你还必须保存一个多态析构函数的实例 类型。这可能有点棘手,但是是可行的,至少在 实践。基本上,您会复制 boost::any 的内容确实,但是 而不是指向动态内存的指针,你会得到“动态内存” 来自第二个数组。

关于c++ - 可以容纳任何 POD 的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9738069/

相关文章:

c++ - 如何编写一个程序来计算这个等式

c++ - Berkelium 编译错误

c++ - 当 std::vector 只包含两个元素时使用它效率低吗?

c++ - 具有 "placeholder"值的宏

c++ - 为什么第二个输出是6?

c++ - istream 到 bool 转换 : when is it available?

python - 寻找一种更有效的方法来矢量化具有不同行信息的 CSV

r - 当向量很大时,如何获得 R 中向量的所有可能分区的列表?

c++ - 推导类型

C++ 数组衰减不会发生以供引用,为什么?