【发布时间】:2018-02-02 17:21:45
【问题描述】:
我一直在尝试找出一种管理动态数组的有效方法,我可能会偶尔更改它,但希望经常随机访问和迭代。
我希望能够:
- 将数组存储在一个连续的数据块中(减少缓存未命中)
- 单独访问每个元素,独立于数组句柄(指针 > 索引)
- 调整数组大小(动态)
因此,为了实现这一点,我一直在尝试使用 std::vector<T>::iterator,它工作得非常好,直到最近,当我调整了我存储迭代器的向量(例如调用 push_back())的大小时。所有的迭代器都失效了,因为它们指向的是陈旧的内存。
是否有任何有效的(可能是 STL-)方法来使迭代器指针保持最新?还是我必须手动更新每个迭代器?
整个方法是否值得?我应该坚持使用索引吗?
编辑: 我以前使用过索引,没关系,但我改变了我的方法,因为它仍然不好。我总是必须将整个数组拖到范围内,并且索引可以很容易地用于任何数组。也没有定义“NULL”索引的完美方法(我不知道)。
更新所有指针以及调整大小操作的选项怎么样?您所要做的就是存储原始vector::begin,调整vector 的大小,然后更新所有指向vector.begin() + (ptr - prevBegin) 的指针,调整大小操作已经是您应该尽量避免的事情了。
【问题讨论】:
-
使用
std::vector并使用size_t索引而不是迭代器。 -
@snow_abstraction 如果您还没有数组的起点,则索引是无用的,因此您需要两条信息。指针直接指向元素本身(但可以无效),因此您不需要任何其他内容。
-
@SteveLorimer:然后使用
std::pair<std::vector<..> *, size_t>,甚至将其包装到支持operator*()/operator->()的类中 -
您可以轻松地使用 -1 的索引来指示 NULL。无法更新指针,因为程序中没有指向数组的所有指针的主列表。
-
@ChrisDodd 如果他删除了一个项目,或者在向量后面以外的任何地方添加了一个项目,一些索引也将失效。不确定他是否需要那种功能
标签: c++ arrays pointers memory-management stl