由于&v[0]
和v.data()
提供了相同的访问std::vector
底层指针的方式,我想知道在稳定性和可移植性方面哪种方法更好?
来自cppreference:
"返回值
指向基础元素存储的指针。对于非空容器,返回的指针与第一个元素的地址相等"。
强调是我的
对于非空的std::vector
,v.data()
和&v[0]
都是相等的。所以在这一点上,选择哪一个只是个人偏好的问题。
但如果我们仔细看,还可以读到:
"返回指向作为元素存储的底层数组的指针。即使容器为空,该指针也是范围[data(); data()+size())始终是有效范围(在这种情况下,data()不可解引用)"
强调是我的
这意味着即使向量为空,您也可以使用由std::vector :: data()
返回的指针(及其大小)上的迭代器工作的任何标准算法。std::vector :: operator[]()
访问值是未定义行为。std::vector::data()
是最好的选择。data()
可能会返回空指针值。在这种情况下,size()
为零,因此 data() + size()
是良好定义的,并且 [data()
; data()+size()
) 仍然是一个有效的范围。 - j6t
[data(); data()+size())
总是有效的,即使容器为空(在这种情况下,data()
不能被解引用)。但不确定在使用&v[0]
时是否仍然成立。 - Adrian Moledata()
可能会返回nullptr
。我不确定他们所说的“有效”范围是什么意思。 - Fareanordata()
比&v[0]
更安全,因为后者会在容器为空时触发未定义行为(除非我弄错了)。 - Fareanordata
是保证有效的。使用&v[0]
会导致未定义行为,而std::vector::data
保证返回有效值(尽管其返回值由具体实现决定)。看起来data
是正确的方式...但在两种情况下仍然需要进行长度检查。 - erip