我来自Java,现在我正在尝试用C ++初始化一个向量。我从this guy's answer找到了一个好方法。但是,我不知道它为什么会起作用。
我向documentation查找了vector的构造函数摘要,发现了这个: screenshot http://i39.tinypic.com/2lvlouc.png
最后一个构造函数是在线程中使用的构造函数,在我的代码中显示:
#include "iostream"
#include "vector"
using namespace std;
int main()
{
static const int arr[] = {1, 2, 3};
vector<int> vec(arr, arr + sizeof(arr) / sizeof(arr[0]));
return 0;
}
如果begin只是c-array,那么如何通过将元素从“begin”复制到“end”来初始化新的向量vec
,并且end本质上是数组元素的数量,加上分配给arr
的内存。也许这个文档太模糊了,这很简单。有人至少可以指出我更好的文档吗?感谢。
答案 0 :(得分:0)
arr[]
是一个数组,arr
是此数组中包含的数据的指针。标准库中的容器使用迭代器来访问数据,这些容器已经在指针之后建模,因此vector
的构造函数也可以使用指针。
向指针添加值称为pointer arithmetic。编译器知道数组中包含的对象的大小,以便在递增时自动将正确的对象大小添加到指针。默认情况下,arr指向数组的第一个元素,arr + 1,指向第二个元素,等等。
sizeof(arr[0])
基本上是数组中元素的大小。 sizeof(arr)
是数组的整个字节大小,因此为了使用指针算法,您需要知道数组中元素的数量,以便迭代在结束时停止。由于数组大小未在代码arr+sizeof(arr)/sizeof(arr[0])
中定义为常量,因此可以计算它。
答案 1 :(得分:0)
根据C ++ Primer,第五版,您可以按如下方式重构代码:
vector<int> vec(begin(arr), end(arr);