首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果vec.data() vec.size() == 0,那么==()返回什么?

如果vec.data() vec.size() == 0,那么==()返回什么?
EN

Stack Overflow用户
提问于 2016-03-15 09:20:04
回答 3查看 2.8K关注 0票数 29

cppreferencestd::vector::data准备了这张便条

返回指向作为元素存储的基础数组的指针。指针是这样的,即使容器是空的,范围[data(); data() + size()) 也总是有效的。

“有效范围”到底是什么意思?如果向量是零长度,data()会返回什么?

具体来说,对于零长度向量:

  1. data()曾经是一个空指针吗?
  2. 它能安全地解除引用吗?(即使它指向垃圾。)
  3. 在两个不同的(零长)向量之间,它保证是不同的吗?

我正在使用一个C库,它接受数组,即使是零长度数组也不允许空指针。但是,如果数组长度为零,它实际上不会取消数组存储指针的引用,它只是检查它是否为NULL。我想确保我能够安全地将data()传递给这个C库,所以上面唯一相关的问题是(1)。(2)和(3)只是出于好奇,以防出现类似的情况。

更新

根据未转化为答案的评论,我们可以尝试以下程序:

代码语言:javascript
复制
#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> v;
    cout << v.data() << endl;

    v.push_back(1);
    cout << v.data() << endl;

    v.pop_back();
    cout << v.data() << endl;

    v.shrink_to_fit();
    cout << v.data() << endl;

    return 0;
}

在我的编译器中,它输出:

代码语言:javascript
复制
0x0
0x7f896b403300
0x7f896b403300
0x0

这表明:

  • data()确实可以是一个空指针,因此答案是(1)是(2) no (3) no
  • 但它并不总是零大小向量的空指针。

是的,很明显我应该在问这个之前试过这个。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-15 09:32:37

太长时间不能发表评论,所以在这里张贴。

我期望迭代器是空序列的nullptr,所以我对它进行了测试。

代码语言:javascript
复制
#include <iostream>
#include <vector>

void pr(std::vector<int>& v){
    std::cout << &*v.begin() << ", " << &*v.end() << "\n";
} 
// technically UB, but for this experiment I don't feel too bad about it.
// Thanks @Revolver    
int main(int argc, char** argv) {
    std::vector<int> v1;
    std::vector<int> v2;

    pr(v1);
    pr(v2);

    return 0;
}

这确实是打印出来的

代码语言:javascript
复制
0, 0
0, 0 

现在,对于空容器,有效范围的唯一合理操作是begin() == end()。不,垃圾不能被取消引用,所以*v.begin()不是一个问题。

票数 6
EN

Stack Overflow用户

发布于 2016-03-15 09:55:39

“有效范围”由迭代器定义。Requiments.General/7 (C++14):

“范围[i,j)是有效的当且仅当j可以从i到达”。

幸运的是,C++定义了将0添加到空指针中会产生一个空指针。那么,从空指针可以到达空指针吗?同一节的第6点对此作了界定:

迭代器j被称为可从迭代器i访问当且仅当表达式++i的应用程序序列有限,从而生成i == j

零长度序列是有限序列,因此data()可以返回空指针.

因此,你的问题的答案是:

  1. data()曾经是一个空指针吗?

  1. 它能安全地解除引用吗?(即使它指向垃圾。)

No

  1. 在两个不同的(零长)向量之间,它保证是不同的吗?

No

票数 22
EN

Stack Overflow用户

发布于 2016-03-15 09:41:01

从标准:

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

因此,对于空向量,它允许为null,但不一定是不可引用的,也不一定是唯一的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36007044

复制
相关文章

相似问题

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