为什么vector(begin,end)构造函数适用于此初始化?

时间:2014-01-16 02:03:04

标签: c++ arrays vector

我来自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的内存。也许这个文档太模糊了,这很简单。有人至少可以指出我更好的文档吗?感谢。

2 个答案:

答案 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);

http://en.cppreference.com/w/cpp/iterator/begin