vec.data()
usually is &vec[0]
除外vec.empty()
。在后一种情况下,vec.data()
可能是nullptr
。
问题:如果我以足够的大小调用vec.reserve
,我知道&vec[0]
将不再更改。但是对于最初为空的 vector 的边缘情况,我是否也可以依靠vec.data()
保持稳定?
基本原理:在ctor中,我想将const T* const
初始化为vec.data()
。没有一个类成员会让vec
超过保留的大小。我可以添加一个临时的单个元素,以便可以编写&vec[0]
,但这似乎有些人为。
最佳答案
我的观点是,即使调用vector::data
之后,没有空 vector 也不保证vector::reserve
返回基础缓冲区。
推理
在issue n. 464中提出了AFAIK vector::data()
,看起来标准中接受了完全相同的提议措辞。
讨论摘录:
To add slightly more convenience to vector and map<Key,T> we should consider to add
- add vector::data() member (const and non-const version) semantics: if( empty() ) return 0; else return buffer_;
- ...
Rationale:
- To obtain a pointer to the vector's buffer, one must use either operator (which can give undefined behavior for empty vectors) or at() (which will then throw if the vector is empty).
...
Standard draft - 22.3.11.4:
Returns: A pointer such that [data(), data() + size()) is a valid range. For a non-empty vector, data() == addressof(front()).
似乎作者希望从理论上总是为一个空容器返回
nullptr
,这就是您的情况。但是提议的和被接受的措辞使模棱两可。的底行是
vector::data()
,因为空 vector 仍返回不确定值。 标准的其他部分([22.3.11.3])共同保证在调用保留后缓冲区将存在,但是
::data
仍可能返回例如按照原始讨论的nullptr
。安全的方法
唯一安全的方法似乎是您的解决方案:
vector::data()
返回值,因为现在保证它是&v[o]
。 注意2.,3。无法交换,
data
可以再次开始返回任何内容。我不知道以下措词可能带来的不利影响。
Returns: A pointer such that [data(), data() + size()) is a valid range. For a non-zero capacity vector, data() == addressof(front()) had the vector had a size of at least 1 at the moment of the call.
关于c++ - 在vector.reserve()之后,vector.data()是否不为null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63338272/