首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果向量为空,那么std::vector.data()应该返回什么?

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

Stack Overflow用户
提问于 2014-08-21 06:45:22
回答 4查看 11.3K关注 0票数 24

根据标准草案(23.3.6.4矢量数据),data()指向基础数组,[data(), data() + size())必须是有效范围:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
#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?例如,实现是否可以执行默认大小的初始分配,并返回指向它的(非空)指针?

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

我真的希望看到一个很好的参考或解释:它是允许的,它必须返回空还是它也可能返回非空的?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-08-21 07:01:43

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

代码语言:javascript
复制
for( iterator ii = X; ii != Y; ++ii) {
...
}

这允许将空范围表示为[X,X)。此外,这个空范围对于每个地址都有很好的定义,不管它是有效的还是无效的。

也就是说,对data()的要求是(强调地雷)

23.3.6.4 vector.data T* data() noexcept除外; const T* data() const noexcept除外; 返回:一个指针,使得[ data(),data()+size()]是一个有效的范围。对于非空向量,data() == & For ()。

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

票数 19
EN

Stack Overflow用户

发布于 2017-11-30 19:04:52

如果向量为空(),则标准中的任何措辞都不表示data()的给定值。

这里有一些明确的证据,说明为什么你不应该假设它可能是零,尽管有时它是:

代码语言:javascript
复制
#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);
}

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

代码语言:javascript
复制
empty() = 1, data() = 0
empty() = 1, data() = 0x7ebc30

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

票数 7
EN

Stack Overflow用户

发布于 2014-08-21 06:59:31

存在这样一种状态,即对象可以有效但未指定:

有效但未指定的状态§17.3 未指定的对象状态,只是满足对象的不变量,并且对对象的操作按照其类型指定 示例:如果std::vector类型的对象x处于有效但未指定的状态,则可以无条件地调用x.empty(),只有当x.empty()返回false时才能调用x.empty()。-end实例

读取C++标准时,当向量为空时,不指定data()的状态。因此,状态是有效但未指定的状态。因此,当向量为空时,data()的返回值可以是任意值(null或随机值)。这取决于编译器的实现。

在这种情况下,按照§17.3中的示例,您应该在使用empty()之前调用data(),以确保返回的值与您的期望相同。

代码语言:javascript
复制
if (!v.empty())
   do_something(v.data())
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25419851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档