为什么 std::vector 不使用偏移量?
Why doesn't std::vector use an offset?
真的是简单的问题。在向量前面添加或删除矢量时,为什么需要移动所有元素以适应此更改?使用偏移量来修改索引到向量时给出的索引将解决此问题。当然,这可能会导致内存中(最多)2个连续的数据块,但这似乎是将线性操作减少到恒定时间的一个小代价。
下面是一个尽可能清楚的示例:
['A', 'B', 'C', _, _, _, _, _] offset is 0, 4th through 8th position unused.
push_front('M')
['A', 'B', 'C, _, _, _, _, 'M'] offset is -1
然后在索引时
operator[](size_t index) {
return backing_array[(index + offset) % size]
}
我明白这意味着可能没有一个纯粹的连续数据块,但从 1 移动到 2 似乎没什么大不了的,以换取恒定的时间推送和弹出前沿。
我明白这意味着可能没有一个纯粹的连续数据块
不,故事就到此为止了。vector
的全部意义在于它是一个"纯粹的连续数据块"。这是实现的基本要求。
做到这一点的能力是vector
整个目的的核心部分:
T *ptr = &vec[0];
ptr+1;
ptr == &vec[1];
因此,接口无法提供阻止vector
连续的其他要求。
vector 背后的整个想法是针对单个连续的数据块:例如,您可以将它们(嗯,第一个元素的地址)传递给 C API,获得良好的缓存局部性等。
该标准为您需要的场景提供了deque
:容器前/后部的快速推/弹出。
相关文章:
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 通过指针偏移量访问结构变量值
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- librdkafka:rd_kafka_assignment 返回分配分区的偏移量 -1001
- 是否通过向封闭对象的地址添加字节偏移量来访问子对象
- 向指针地址添加 20 个字节偏移量
- glMapBufferRange(..) 中的偏移量关系和 glDrawArraysInstanced(..) 中的第一
- 是否有与 C# Structs/StructLayout 等效的功能,C++中的字段偏移量?
- 我的 sumASCII 函数中的此偏移量是多少?
- boost::序列化中的派生类偏移量计算.有效吗?
- RedisGraph 语法错误在偏移量 8 靠近"创建"
- C++ std::map:获取特定偏移量的密钥
- 在标准布局对象中进行指针运算(例如,使用偏移量)时,我们是否需要使用 std::launder?
- 从带有位偏移量的std::字符串中按字节提取连续位
- 获取第 n 项与 std::set 中第一个/最后一个的偏移量
- 为什么 std::vector 不使用偏移量?
- std::ofstream 打开文件并替换特定的偏移量
- 为什么 std::copy 抛出错误向量迭代器 + 偏移量超出范围并且无法复制
- std::set_intersection,带偏移量的交集列表
- 使用std::transform从特定的目标偏移量插入到目标