当向量中还没有元素时返回指向向量底层缓冲区的指针的正确方法是什么(size() == 0)
.我先调用vector.reserve()
,因此分配了内存。
我已经尝试了以下内容,但它为我期望的相同值提供了不同的指针值。从我用谷歌搜索的内容来看,当size()
为零时,似乎也未定义调用.front()
和.data()
。我需要获取指向向量的指针,以便我可以将其传递给 C 函数。
int main() {
std::unique_ptr<std::vector<int>> vec(new std::vector<int>(10));
std::cout << std::hex
<< (uint64_t)&vec.get()[0] << " "
<< (uint64_t)&vec->front() << " "
<< (uint64_t)vec->data() << std::endl;
return 0;
}
输出:
2b324a4cec20 2b324a4cec402b324a4cec40
如果在 GCC 上运行此代码,.data()
返回 0。然后标准说front()
是未定义的,因为size()
是 0。如您所见,指针值不同。这是怎么回事?
一个可以玩的例子
在阅读了这些评论和更多的谷歌搜索之后,如果 size(( == 0
-
不能调用运算符[0],因为它是空向量的UB。
-
不能调用 at(0(,因为它与 operator[] 相同(并且进行范围检查(
-
不能调用 .data((,因为它只能保证 [data((, data(( + size( 是一个有效的范围,并不是说这个范围没有 从 0 开始。
-
&front(( 不能调用,因为它是空向量的 UB。
我个人认为这是语言中的错误。如果调用了 reserve,Data(( 应该返回一个指向向量的指针