一只甜甜圈
// Create a vector v5 by copying the range v4[_First, _Last)vector <int> v5( v4.begin( ), v4.begin( ) + 3 );它在last的那个位置取的是开区间...看这个程序.使用这个构造函数的时候,第一个参数是_first,即第一个元素的地址,第二个是_end(注,并不是最后一个元素的地址,而是最后一个元素后下一个元素的地址)比如我们一般写循环for(iterator = vector.begin(); iterator!=vector.end(), vector++)这样的.vector.end()这个方法返回的是最后一个元素的下一个终结的地址.msdn里面对于end()返回值的解释是这样的:Returns a random-access iterator that points just beyond the end of the vector.这下就好理解了,对于数组来说,我们循环的一般写法是这样的.for(int i = 0; i<array.length; i++);但是按照msdn的要求,我们如果知道最后一个元素的地址记做array.last+1,我们也可以写成这样for(array *temp = array; temp!=array.last+1; temp++);这样就能看出来了,和下面那个写法是不是很像?for(iterator = vector.begin(); iterator!=vector.end(), vector++)用迭代变量的时候是这样构造,假设我们复制vec1的元素到vec2vector(vec1.begin(),vec1.end());那么对应的手动复制数组到vector的时候,vec1.begin()对应的就是array,vec1.end()对应的就是array.last+1.即array+length;这就是为什么复制的时候加的不是3,而是4的原因了.#include "stdafx.h"#include <iostream>#include <vector>using namespace std;int _tmain(int argc, _TCHAR* argv[]){int array2[]={2,3,4,5};vector<int> vecList2(array2, array2+4);vector<int>::iterator v5_Iter;vector<int> vecList1(vecList2.begin(), vecList2.end());for ( v5_Iter = vecList1.begin( ) ; v5_Iter != vecList1.end( ) ; v5_Iter++ )cout << " " << *v5_Iter;getchar();return 0;}