从空std :: vector获取原始数据指针

时间:2017-03-09 12:38:15

标签: c++ c++03

这是一种未定义的行为:

std::vector<int> v;
int const * a = &v[0];

我的目标是避免使用UB,vector::data()功能会起作用。但我需要在没有>=C++11的情况下这样做。

例如,如果我要用vector::reserve分配一些内存,它会起作用吗?

v.reserve(1);
int const * a = &v[0];

澄清:

在我取指针后,矢量不会改变,矢量可能为空或包含数据。

2 个答案:

答案 0 :(得分:2)

只需在条件运算符中执行检查:

int const * a = v.empty() ? NULL : &v[0];

这比data()有额外的好处,你可以从指针本身检查向量是否为空:如果是,a为空。

答案 1 :(得分:0)

向量不提供对其元素指针的任何保证。使用你所做的保留是非常危险的,因为你可能稍后push_back()某个元素,这可能使你的指针无效。

如果你想要一个更好的故事,请考虑使用push_backerase甚至迭代器可能会失效...为什么指针仍然有效?