C++ vector基本问题

当定义一个vector后,为什么赋值的时候
int array2[]={2,3,4,5};
vector<int> vecList2(array2,array2+4);
后面是加4呢?如果按照其实位置array的话是2,array[1]=3,array[2]=4,array[3]=5,都是向后移动了3格而已啊?为什么要向后移动4格的呢?

msdn例子里面有这么一句话:
// 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的元素到vec2
vector(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;
}追问

msdn应该进去哪里看具体这些语法呢?是learn那里吗?里面太多资料了,一般学习是看那一块呢?谢谢

追答

晕...里面有几处笔误. 最后一个元素的地址是array.last,
还有for(iterator = vector.begin(); iterator!=vector.end(), iterator++)这样的.不是vector++
msdn里面就查vector,看它对构造函数的解释就行了..你先看,不明白了再问哈

还有一个问题,之所以采用这种STL风格,也更容易的去表示空集了..比如[a,a)...

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-10-11
i=start; i < end; ++i
array2一共有4个元素,为array2[0],array2[1],array2[2],array2[3]
start从array2开始,end=array2+4,
第2个回答  2011-10-11
STL的迭代器参数都使用“超出末端迭代器”,意思是,用两个迭代器指示范围时,要传递第一个元素的迭代器 和 最后一个元素的 下一个元素的迭代器。vector容器的end函数返回的就是超出末端迭代器,rend也是(返回第一个元素的 前一个元素的迭代器)。因此,遍历时可以使用迭代器和超出末端迭代器相等作为跳出循环条件。
相似回答