当您希望以C数组的形式访问std::vector时,可以从至少四种不同的方式中进行选择,如本例所示:
#include <iostream>
#include <vector>
using namespace std;
int main() {
std::vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(42);
vec.push_back(24024);
{
int* arr = vec.data();
cout << arr << endl; /* output: 0x9bca028 */
cout << arr[3] << endl; /* output : 24024 */
}
{
int* arr = &vec.front();
cout << arr << endl; /* output: 0x9bca028 */
cout << arr[3] << endl; /* output : 24024 */
}
{
int* arr = &vec[0];
cout << arr << endl; /* output: 0x9bca028 */
cout << arr[3] << endl; /* output : 24024 */
}
{
int* arr = &vec.at(0);
cout << arr << endl; /* output: 0x9bca028 */
cout << arr[3] << endl; /* output : 24024 */
}
}在大多数情况下,我发现的是&vec[0]。我觉得这是最不优雅的,所以.为什么它是最常用的?是更高效的还是更兼容的?我找不到很多关于data()的文档。
发布于 2012-05-24 15:05:53
data()对C++11来说是全新的,这就是为什么你不经常看到它的原因。我从来没有想到使用&vec.front()的想法,这可能是因为我使用operator[]的频率比front() (几乎从不)高。我想其他人也是一样的。
发布于 2012-05-24 15:10:42
如果您使用的是C++11,那么使用data()肯定更好。特别是,如果向量是空的,那么使用其他两个选项中的任何一个就会产生未定义的行为!如果您没有使用C++11,并且向量可能是空的,那么一定要检查该条件。
发布于 2012-05-24 18:17:03
使用&vec是最常见的,不过,我同意,看起来确实有点奇怪。对未来有一件事要记住。如果您的向量恰好是其类重载操作符&()的对象的向量,那么请注意,如果调用&vec,这将导致奇怪的行为。
这将不会获得对象内部连续数组中第一项的起始地址,它将返回vec.operator&()返回的任何内容。如果不是全部的话,那也不是你要找的地址(绝地之手挥手)。
这方面的一个很好的例子是ATL的CComPtr。它重载操作符&(),因此将其存储在向量中可能会有问题。为了解决这个问题,ATL有一个CAdapt模板类,它可以用于隐藏CComPtr上的操作符&()
https://stackoverflow.com/questions/10740094
复制相似问题