2014-01-16 36 views
0

我来自Java,我现在试图用C++初始化一个向量。我从this guy's answer找到了一个好方法。但是,我不知道它为什么起作用。为什么vector(begin,end)构造函数为这个初始化工作?

我抬头看了看documentation为载体的构造总结和发现这一点: 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数组,并且end基本上是数组元素的数量,并且分配了内存,那么如何通过将元素从“begin”复制到“end”来初始化新矢量vecarr。也许这个文档太模糊了,这很简单。有人可以至少指出我更好的文档?谢谢。

+0

它处理指针和对待他们就像一个数组的开头和结尾。它所做的任何事情都是'++ foo'(或'foo ++'我想)和'* foo'。这适用于指针和迭代器。至于文档,我从来没有听说过,但我崇拜http://en.cppreference.com/w/cpp。它也[链接](http://en.cppreference.com/w/cpp/concept/InputIterator)符合'begin'和'end'类型的要求。 – chris

+0

'begin' /'end'需要是迭代器,指针是迭代器 –

+0

@BryanChen,它们至少具有随机访问迭代器的资格。 – chris

回答

0

arr[]是一个数组,arr是包含在这个数组中的数据的指针。标准库中的容器使用迭代器来访问数据,并且这些已经在指针之后建模,所以这也是为什么vector的构造函数也可以使用指针。

向指针添加值称为pointer arithmetic。编译器知道数组中包含的对象的大小,以便在增量时自动将正确的对象大小添加到指针。默认情况下,arr指向数组的第一个元素,arr + 1,第二个元素等。

sizeof(arr[0])基本上是数组中元素的大小。 sizeof(arr)是数组的整个字节大小,所以为了使用指针算术,您需要知道数组中元素的数量,以便迭代在最后停止。由于数组大小没有被定义为代码arr+sizeof(arr)/sizeof(arr[0])中的常数,因此是计算它的一种方法。

+0

我花了很长时间才明白,而且我可以说你的链接是我提到过的最丰富的内容之一。我想我明白了,所以我会尽量总结,希望你有时间来检查我:'vector (begin,end)'与'vector vec(arr,arr + sizeof(arr)/sizeof(arr [0]))',因为它声明了一个int类型的向量,然后从“arr”开始的点开始寻找地址,因为arr是一个指针(这是一个地址或者可以像一个地址?),所以它只是做这个'vec [i] = arr + i * sizeof(T)'直到到达“结束”地址。 – michaelsnowden

+0

无关于指针/地址混淆的括号部分;我发现[这](http://stackoverflow.com/questions/15151377/what-exactly-is-a-c-pointer-if-not-a-memory-address) – michaelsnowden

相关问题