Ale*_*ato 24 c++ arrays vector
当您想要将std :: vector作为C数组访问时,您可以从至少四种不同的方式中进行选择,如本例中所示:
#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 */
}
}
Run Code Online (Sandbox Code Playgroud)
我在大多数情况下发现的那个是&vec[0]
.我认为这是最不优雅的,所以......为什么它最常用?它更有效还是更兼容?我找不到很多关于的文档data()
.
Ben*_*ley 18
data()
是C++ 11的新手,这就是为什么你不经常看到它.使用的想法&vec.front()
从来没有发生在我身上,可能是因为我operator[]
经常使用front()
(几乎从不).我想其他人也一样.
Edw*_*per 17
如果您使用的是C++ 11,那么使用data()
它绝对是可取的.特别是,如果向量为空,则使用其他两个选项中的任何一个都会产生未定义的行为!如果你没有使用C++ 11,并且向量可能是空的,那么一定要检查那个条件.
使用&vec [0]是最常见的,但我同意,看起来确实有些奇怪.有一点要记住未来.如果你的向量恰好是一个对象的向量,它的类重载了运算符&(),那么如果你调用&vec [0]就会意识到这会导致奇怪的行为.
这将不会获得内部连续对象数组中第一个项的起始地址,它将返回vec [0] .operator&()将返回的任何内容.大多数(如果不是全部的话),这不是你正在寻找的地址(绝地手波).
一个很好的例子是ATL的CComPtr.它会重载operator&(),因此将其存储在向量中可能会有问题.为了解决这个问题,ATL有一个CAdapt模板类,可用于在CComPtr上隐藏运算符&()