总结几点vector使用心得。
1.使用vector迭代器对数组元素进行遍历访问
vector<int> v_int;
vector<int>::iterator iter;
for(iter = v_int.begin();iter!=v_int.end();iter++)
{
cout<<*iter<<endl;
}
上面的代码段是一段遍历vector很标准的代码,基本上不会出错,因为不涉及vector中的删除,插入等操作。
2.迭代器在vector调用erase,insert等函数后,会失效
for(iter = v_int.begin();iter!=v_int.end();iter++)
{
v_int.insert(iter,4,3);
}
上面的代码会报vector iterator not incrementable的错误。
3.end()函数在调用erase函数之后的变化。
vector<int> v_int;
for(int i = 0 ;i<5;i++)
{
v_int.push_back(i);
}
执行完上述代码之后,v_int中的元素为 0,1,2,3,4 五个元素
vector::iterator iter = v_int.end();
这个时候iter指向4之后的一个未初始化的地址。
iter = v_int.begin();
iter= v_int.erase(iter);
这个时候v_int删除了第一个元素0,执行完这个函数之后,
iter=v_int.end();
则iter指向了4,也就是v_int的最后一个元素,这个时候,一些常用的遍历操作就容易出错了。
4.for循环执行顺序的问题
如下代码
vector<int> v_int;
for(int i = 0 ;i<3;i++)
{
v_int.push_back(i);
}
vector<int>::iterator iter;
for(iter = v_int.begin();cout<<"B"<<endl,iter!=v_int.end();iter++,cout<<"A"<<endl)
{
}
输出结果为
B
A
B
A
B
A
B
也就是说,for循环中,一开始先判断第二个表达式是否成立,成立则进入循环体,执行完循环体之后,先执行表达式3,再进行表达式2的判断,这样的话,在vector的迭代器使用的时候,就很容易出现一个问题,一旦迭代器iter已经指向最后一个元素了,再进入下一个循环体的判断过程,就会先iter++,然后再判断iter!=v_int.end(),这个时候就会报vector iterator not incrementable或者vector iterator not dereferencable的错误,都是越界错误。例如如下代码:
for(iter = v_int.begin();iter!=v_int.end();iter++)
{
iter = v_int.erase(iter);
cout<<*iter<<endl;
}
报错:vector iterator not dereferencable
如下代码:
for(iter = v_int.begin();iter!=v_int.end();iter++)
{
iter = v_int.erase(iter);
}
报错:vector iterator not incrementable,iter指向了v_int.end()时,再对其进行iter++操作报错。
以上情况都经代码运行实测