相关疑难解决方法(0)

如果向量为空,std :: vector :: data()应该返回什么?

根据标准草案(23.3.6.4向量数据),data()指向底层数组,并且[data(), data() + size())必须是有效范围:

T* data() noexcept;
const T* data() const noexcept;

    1 Returns: A pointer such that [data(),data() + size()) is a valid range. For a non-empty vector,
data() == &front().
    2 Complexity: Constant time
Run Code Online (Sandbox Code Playgroud)

但是如果向量是空的呢?当我构造一个零大小的向量时:

#include <vector>
#include <iostream>

int main() {
    const int NUM = 0*10;
    std::vector< double > v( NUM, 0.0 );
    std::cerr << "V : "<< v.data() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

MSVC 2010返回null,但在Linux(使用GCC 4.2.1和Intel 12.1)上,我得到一个非空地址.

vector::data()允许还是应该返回null?例如,一个实现可以执行默认大小的初始分配并返回一个(非空)指针吗?

编辑:几个答案集中在空范围的有效性.我完全同意.

我真的希望看到一个很好的引用或解释:是否允许 …

c++ vector

16
推荐指数
2
解决办法
6864
查看次数

有一个指向保留向量元素的指针是否合法?

我很好奇这种事情是否合法:

std::vector<some_class_type> vec;
vec.reserve(10);
some_class_type* ptr = vec.data() + 3; // that object doesn't exist yet
Run Code Online (Sandbox Code Playgroud)

请注意,我没有尝试访问指向的值.

这是标准所说的data(),但我不确定它是否相关:

返回:指针,这[data(),data() + size())是一个有效的范围.对于非空向量,data() == &front().

c++ pointers vector undefined-behavior language-lawyer

10
推荐指数
1
解决办法
453
查看次数

超出size()和容量()的C++访问向量

data()[i]对于i矢量size()和矢量下的索引,访问矢量是否安全capacity()

这是我的推理:

a)根据cplusplus,capacity()是"当前为矢量分配的存储空间的大小",这让我觉得我的问题的答案是YES,但是

b)使用reserve()和访问datavector之外size()应该是安全的,因为根据cplusplus,reserve()"导致容器重新分配其存储,将其容量增加到n",但随后

C)#1话题矛盾的声明b)以上

所以我很困惑并寻找答案.

c++ vector

1
推荐指数
1
解决办法
207
查看次数