c++ - 如果 vector 为空,std::vector::data() 应该返回什么?

标签 c++ vector

根据标准草案(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/

相关文章:

c++ - 还需要最终确定的 CRTP 中间类

c++ - 对 std::wstring 的 vector 进行排序实际上会重写原始字符串数据吗?

c++ - 内存地址值变化监听器

c++ - 如何将派生对象添加到 unique_ptr 的 vector 中

c++ - remove_if 基于带有仿函数的 vector 索引

c++ - 有人可以解释为什么 int 会根据系统架构呈现不同的大小吗?

c++ - 模板化 ostream 重载歧义错误 : basic_ostream<char> vs const char[]

c++ - std::vector 和构造函数

C++ 和标准容器 : memory addresses of members

c++ - 对 2dim vector 进行排序并保留索引