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

And*_*dré 16 c++ vector

根据标准草案(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?例如,一个实现可以执行默认大小的初始分配并返回一个(非空)指针吗?

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

我真的希望看到一个很好的引用或解释:是否允许,它必须返回null还是也可以返回非null?

Mas*_*ano 12

范围的约定是[inclusive, exclusive),即如果迭代一个范围,[X,Y)您将在概念上执行以下操作(伪代码):

for( iterator ii = X; ii != Y; ++ii) {
...
}
Run Code Online (Sandbox Code Playgroud)

这允许表达空范围[X,X).此外,每个地址都可以很好地定义这个空范围,无论它是有效还是无效.

那说的要求data()(强调我的):

23.3.6.4 [vector.data]

T*data()noexcept;

const T*data()const noexcept;

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

在我看来,唯一无条件的保证是[data(),data() + size())应该是一个有效的范围.对于size() == 0成员函数,data()可以返回任何值,范围将是有效的空范围.因此,我会说如果size()为零,则允许实现返回非空指针.


Ric*_*ges 5

如果向量为empty(),则标准中的任何措辞均未暗示data()的给定值。

这是一些权威的证明,说明即使有时是零,为什么也不应该假定它为零:

#include <vector>
#include <iostream>


void value_of_data(std::vector<int> const& v)
{
    std::cout << "empty() = " << v.empty() << ", " << "data() = " << static_cast<const void*>(v.data()) << std::endl;
}



int main()
{
    std::vector<int> v;
    value_of_data(v);

    v.resize(100, 0);
    v.clear();
    value_of_data(v);
}
Run Code Online (Sandbox Code Playgroud)

示例输出(gcc7.2,-O2,linux):

empty() = 1, data() = 0
empty() = 1, data() = 0x7ebc30
Run Code Online (Sandbox Code Playgroud)

http://coliru.stacked-crooked.com/a/dd1d13200c8b9a3a