在保留之后使用std::vector::data
Use std::vector::data after reserve
我有一个std::vector
,我称之为reserve
具有较大的值。之后我检索data()
。
因为迭代data
然后崩溃,我想知道这是否被允许。reserve
是否强制更新data
到已分配的内存范围?
reserve
保证后续插入不会重新分配,因此不会导致无效。就是这样。没有进一步的保证。
是否强制
reserve
将data
更新到已分配的内存范围?
。标准只保证std::vector::data
返回一个指针,[data(), data() + size())
是一个有效范围,capacity
不涉及。
§23.3.11.4/1向量数据[vector.data]:
返回:一个指针,使得
[data(), data() + size())
是有效的的范围内。对于非空向量,data() == addressof(front())
.
对于空(size() == 0
)向量,即使它具有非零容量,data()
也不要求返回可解引用指针。它可能返回nullptr
或一些任意值(在这种情况下,唯一的要求是它应该能够与自身进行比较,并且可以在不调用UB的情况下向其添加0)。
我想说文档在这个主题上是非常清楚的:data() + size()
之后的任何东西都可能是分配的但不是初始化的内存:如果你也想初始化这个内存,你应该使用vector::resize
。
void reserve (size_type n);
请求更改容量
要求vector容器容量至少足以容纳n个元素。
如果n大于当前向量容量,则函数导致容器需要重新分配其存储空间,将其容量增加到n(或更高)。
在所有其他情况下,函数调用不会导致重新分配且矢量容量不受影响。
该函数对vector的大小没有影响,也不能改变vector的大小
元素。
我不知道为什么你想在reserve()
之后访问data() + size()
之后的任何东西:reserve()
的预期用途是在你知道或可以估计容器的预期大小时防止不必要的重新分配,但同时避免不必要的内存初始化,这可能是低效的或不切实际的(例如,初始化的非平凡数据不可用)。在这种情况下,您可以仅用1替换log(N)
重新分配和副本,从而提高性能。
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中用vector填充一个简单的动态数组
- 如何将 std::string 赋回作为 <char>void* 指针传递的 std::vector.data()?
- std::vector<std::wstring> 移动/重新分配内部 wstring.data() 合法吗?
- 使用 std::vector,为什么 &vec[0] 未定义的行为,而 vec.data() 是安全的?
- C++ vector<Data> to vector<IData>
- 如何在 OpenMP 4 中为 std::vector 编写"target data map"?
- C++ std::vector.data not found by MinGW
- placement new和vector::data()可以用来替换向量中的元素吗
- 通过 std::vector.data() 指向 std::vector 元素的指针指向损坏的数据
- c++将存储在std::vector中的数据传递给c_func(void*data)
- std::vector: vec.data() or &vec[0]
- STL Vector:临时调用 data() 时的未定义行为
- Python 的 Visual C++ 无法处理 c++11 错误 C2039:"data":不是 std::vector 的成员
- 如果vector为空,std::vector::data()应该返回什么?
- 当你在 std::vector 上调用 data() 时会发生什么<bool>?
- 为什么std::vector::data和std::string::data不同?
- 在保留之后使用std::vector::data
- 对cublassgem使用指向vector
::data()的指针 - std::vector::data()是否通过移动而保留