标签: c++ c++03
这是一种未定义的行为:
std::vector<int> v; int const * a = &v[0];
我的目标是避免使用UB,vector::data()功能会起作用。但我需要在没有>=C++11的情况下这样做。
vector::data()
>=C++11
例如,如果我要用vector::reserve分配一些内存,它会起作用吗?
vector::reserve
v.reserve(1); int const * a = &v[0];
澄清:
在我取指针后,矢量不会改变,矢量可能为空或包含数据。
答案 0 :(得分:2)
只需在条件运算符中执行检查:
int const * a = v.empty() ? NULL : &v[0];
这比data()有额外的好处,你可以从指针本身检查向量是否为空:如果是,a为空。
data()
a
答案 1 :(得分:0)
向量不提供对其元素指针的任何保证。使用你所做的保留是非常危险的,因为你可能稍后push_back()某个元素,这可能使你的指针无效。
push_back()
如果你想要一个更好的故事,请考虑使用push_back和erase甚至迭代器可能会失效...为什么指针仍然有效?