为了账号安全,请及时绑定邮箱和手机立即绑定

以下是关于C++ vector基本问题,麻烦大神们帮帮忙

以下是关于C++ vector基本问题,麻烦大神们帮帮忙

C++
牧羊人nacy 2021-10-25 18:14:33
当定义一个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格的呢?
查看完整描述

2 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

// 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;
}



查看完整回答
反对 回复 2021-10-31
?
互换的青春

TA贡献1797条经验 获得超6个赞

i=start; i < end; ++i
array2一共有4个元素,为array2[0],array2[1],array2[2],array2[3]
start从array2开始,end=array2+4

查看完整回答
反对 回复 2021-10-31
  • 2 回答
  • 0 关注
  • 216 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信