c++ - 在vector.reserve()之后,vector.data()是否不为null?

标签 c++

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

  1. add vector::data() member (const and non-const version) semantics: if( empty() ) return 0; else return buffer_;
  2. ...

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/

    相关文章:

    java - 从 C/C++ JNI 传递参数到 Java 并获取修改后的值

    c++ - SDL_ttf 框架不会在 xCode 上运行,给出错误链接器命令失败,退出代码为 1

    c++ - 是否有与 `memchr` 具有相似性能的函数可以将每个字符与位掩码匹配而不是完全相等?

    c++ - 模板模板推导给我一个通用引用的错误

    c++ - 如何读取两个文件并正确关闭第一个文件? C++

    c++ - 网格类中损坏的顶点数据

    c++ - 适用于 Android 的 FreeType2 交叉编译

    c++ - LR解析时构造AST

    c++ - 移动结构数组 C++

    c++ - 类型、整型常量和模板模板参数的可变参数模板