【发布时间】:2022-12-19 12:10:11
【问题描述】:
由于&v[0]和v.data()提供了相同的方式来访问std::vector的底层指针,我想知道在稳定性和可移植性方面哪种方式是更好的选择?
【问题讨论】:
-
由于
std::vector提供了一个data()成员函数,我认为不需要手动获取第一个元素的地址。唯一“更好”的选择是出于可读性目的。std::vector永远有下标运算符,它永远有一个data()成员,所以在稳定性和便携性方面选择哪个不是问题^^它们基本相同,并且都需要存在标准。 -
唔。来自cppreference:指针的范围是 [data(); data()+size()) 始终是有效范围,即使容器为空(在这种情况下 data() 不可取消引用)。不确定使用
&v[0]时是否成立。 -
@AdrianMole 但是,如果您进一步观察,他们会提到如果向量为空,
data()可能会或可能不会返回nullptr。我不确定他们的意思“有效的”范围。 -
@Fareanor 这里有一些讨论:stackoverflow.com/q/25419851/580083。
-
直到
data保证有效。有了它,&v[0]可以导致 UB,而std::vector::data保证返回有效的东西(尽管它的返回值是实现定义的)。似乎data是正确的方法......尽管在这两种情况下您仍然需要长度检查。