根据标准草案(23.3.6.4 vector data),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
但是如果 vector 为空怎么办?当我构造一个零大小 vector 时:
#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;
}
MSVC 2010 返回 null,但在 Linux(使用 GCC 4.2.1 和 Intel 12.1)上我得到一个非空地址。
是否允许 vector::data()
返回 null?例如,实现是否可以进行默认大小的初始分配并返回指向它的(非空)指针?
编辑:几个答案集中在空范围的有效性上。我完全同意那里。
我真的很想看到一个很好的引用或解释:是否允许,必须返回 null 或者可以返回非空值?
最佳答案
范围的约定是[inclusive, exclusive)
,也就是说,如果您遍历范围[X,Y)
,您将在概念上执行以下操作(伪-代码):
for( iterator ii = X; ii != Y; ++ii) {
...
}
这允许将空范围表示为 [X,X)
。此外,对于每个地址,这个空范围是完美定义的,无论它是有效还是无效。
也就是说 data()
的要求是(强调我的):
23.3.6.4 [vector.data]
T* data() noexcept;
const T* data() const noexcept;
Returns: A pointer such that [data(),data() + size()) is a valid range. For a non-empty vector, data() == &front().
在我看来,唯一无条件的保证是 [data(),data() + size())
应该是一个有效范围。对于 size() == 0
,成员函数 data()
可以返回任何值,范围将是一个有效的空范围。因此我会说,如果 size()
为零,则允许实现返回非空指针。
关于c++ - 如果 vector 为空,std::vector::data() 应该返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47580229/