【发布时间】:2021-12-07 11:17:13
【问题描述】:
我对@987654322@的理解是,它本质上包含指向容器的指针、大小和一些有用的成员函数。
template<typename T>
class SimpleSpan {
T* ptr;
size_t length;
// some member functions
}
我可以取一个向量的跨度,如 this question 所示。
如果我在向量的末尾添加条目,则可能需要调整向量的大小。调整矢量大小时,会发生以下步骤(顺序不重要)。
-
在具有更多空间的堆上分配一个新数组。
-
向量中的条目被移动到新数组中。
-
vector到vector的数组的成员ptr更改为新数组的开头。 -
旧数组被释放。
如果vector 的数组需要重新分配并变大,span 会发生什么事情吗?在 push_back 对 vector 未定义行为调用之后,是否将 span 用于 vector?
【问题讨论】:
-
push_back可能使其元素的指针、引用和迭代器无效。仅当push_back必须增加capacity时才会发生这种情况。如果capacity() > size()在push_back之前,则span 将保持有效。 -
resize 不一定是重新分配,只有在容量不够时才需要重新分配,尽管它只是措辞上的挑剔
标签: c++ vector undefined-behavior ownership-semantics std-span