【发布时间】:2011-07-22 17:58:40
【问题描述】:
boost 中是否有一个类似于 array 的类,它是一种类似 POD 的类型,带有一个数组,但在容器中提供了可变数量的项目。也就是说,我想说数组最多有 10 个项目,但在任何给定时刻可能包含 0 到 10 个项目。
boost::array 不幸地将size() 修复为常量N,因此它不能作为向量的替代品。我特别希望结构的读者不要知道它是一个静态数组,他们可以像任何其他容器一样使用begin() 和end()。
显然,push_back() 如果超出容量,则必须通过异常处理。
boost 中已有的内容将是首选。
注意:它必须是类似POD的数据类型。为清楚起见,整个类数组对象,包括内容(本身将由类 POD 类型)必须是类 POD。这是出于序列化/复制的原因(以及与该序列化/复制相关的性能)。
我的意思是类似于 POD:
- 具有编译时常量大小
- 可以安全地 memcpy'd
对于那些说它行不通或不可能的人。这没有什么巧妙之处。 boost::array 是一种类似 POD 的类型。只需为当前大小添加一个额外的字段,以使其成为我想要的。我正在寻找一个已经存在的实现(因此经过适当的测试/维护)。
【问题讨论】:
-
为什么一定要POD类型?这个要求对我来说似乎相当武断。你需要序列化数组还是什么?我不认为你可以拥有一个动态增长的数组并同时让它成为 POD。有很多簿记代码可以有效地处理可以增长的数组。只需查看一个像样的
std::vector实现的源代码。 -
对此的简单回答是我没有遇到过这样的事情。 AFAIK 的最佳解决方案是实现类似容器的 boost 数组(接口非常简单)并根据需要添加大小信息。
-
对于每个对动态大小感兴趣的人,我认为 OP 想要的是一个固定大小的堆栈分配数组,它跟踪插入了多少项目(直到它的最大大小) .这是一个相当直接的要求,不幸的是 boost 数组没有满足(即无法测试数组中实际触摸了多少项目)
-
(除了POD部分)不是重复的,而是相关的:stackoverflow.com/questions/3563591/…,在sbi的回答中有一个实现
-
@edA-qa mort-ora-y:我不确定您是否理解 POD 的实际含义,这意味着您的要求使您无法回答,因为您要求的是您不知道的东西不需要。基本上对于要成为 POD 的类型,它不能有任何构造函数,但是对于新成员属性大小以保持跟踪实际元素数量的不变性,它必须被初始化,这需要构造函数。为了安全起见,成员也应该是私有的,这是破坏 POD 的另一个原因。如果您对答案投了反对票,请重新考虑