cppreference为std::vector::data准备了这张便条
返回指向作为元素存储的基础数组的指针。指针是这样的,即使容器是空的,范围
[data(); data() + size())也总是有效的。
“有效范围”到底是什么意思?如果向量是零长度,data()会返回什么?
具体来说,对于零长度向量:
data()曾经是一个空指针吗?我正在使用一个C库,它接受数组,即使是零长度数组也不允许空指针。但是,如果数组长度为零,它实际上不会取消数组存储指针的引用,它只是检查它是否为NULL。我想确保我能够安全地将data()传递给这个C库,所以上面唯一相关的问题是(1)。(2)和(3)只是出于好奇,以防出现类似的情况。
更新
根据未转化为答案的评论,我们可以尝试以下程序:
#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;
}在我的编译器中,它输出:
0x0
0x7f896b403300
0x7f896b403300
0x0这表明:
data()确实可以是一个空指针,因此答案是(1)是(2) no (3) no是的,很明显我应该在问这个之前试过这个。
发布于 2016-03-15 09:32:37
太长时间不能发表评论,所以在这里张贴。
我期望迭代器是空序列的nullptr,所以我对它进行了测试。
#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;
}这确实是打印出来的
0, 0
0, 0 现在,对于空容器,有效范围的唯一合理操作是begin() == end()。不,垃圾不能被取消引用,所以*v.begin()不是一个问题。
发布于 2016-03-15 09:55:39
“有效范围”由迭代器定义。Requiments.General/7 (C++14):
“范围
[i,j)是有效的当且仅当j可以从i到达”。
幸运的是,C++定义了将0添加到空指针中会产生一个空指针。那么,从空指针可以到达空指针吗?同一节的第6点对此作了界定:
迭代器
j被称为可从迭代器i访问当且仅当表达式++i的应用程序序列有限,从而生成i == j。
零长度序列是有限序列,因此data()可以返回空指针.
因此,你的问题的答案是:
data()曾经是一个空指针吗?是
No
No
发布于 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,但不一定是不可引用的,也不一定是唯一的。
https://stackoverflow.com/questions/36007044
复制相似问题