招聘网站建设需求文档,网站调用新浪微博,兰州新晨诚网络科技有限公司,西安在线网迭代器C中#xff0c;迭代器就是类似于指针的对象#xff0c;但比指针的功能更丰富#xff0c;它提供了对对象的间接访问#xff0c;每个迭代器对象代表容器中一个确定的地址。举个例子#xff1a;void test()
{vectorint vv{1,2,3,4,5};for(vectorint::i…迭代器C中迭代器就是类似于指针的对象但比指针的功能更丰富它提供了对对象的间接访问每个迭代器对象代表容器中一个确定的地址。举个例子void test()
{vectorint vv{1,2,3,4,5};for(vectorint::iterator itvv.begin();it!vv.end();it){cout*it ;}coutendl;
}
//1 2 3 4 5迭代器的分类正向迭代器只能使用运算符从左向右遍历容器每次沿容器向右移动一个元素。容器名元素类型::iterator 迭代器名; // 正向迭代器。容器名元素类型::const_iterator 迭代器名; // 常正向迭代器。相关的成员函数iterator begin();const_iterator begin();const_iterator cbegin(); // 配合auto使用。iterator end();const_iterator end();const_iterator cend();双向迭代器具备正向迭代器的功能还可以反向从右到左遍历容器也是用不管是正向还是反向遍历都可以用--让迭代器后退一个元素。容器名元素类型:: reverse_iterator 迭代器名; // 反向迭代器。容器名元素类型:: const_reverse_iterator 迭代器名; // 常反向迭代器。相关的成员函数reverse_iterator rbegin();const_reverse_iterator crbegin();reverse_iterator rend();const_reverse_iterator crend();随机访问迭代器具备双向迭代器的功能还支持以下操作用于比较两个迭代器相对位置的关系运算、、、。迭代器和一个整数值的加减法运算、、-、-。支持下标运算iter[n]。迭代器的失效问题 vector迭代器失效的几种情况1. 扩容可能引起迭代器失效insert,assign,push_back都可能引起扩容void test3()
{vectorintv;for (int i 0; i 5; i)v.push_back(i);cout 容量 v.capacity() endl;cout 大小 v.size() endl;auto it v.begin();int size v.capacity(); //记录插入数据之前的容量v.push_back(6);v.push_back(7); cout 容量 v.capacity() endl;cout 大小 v.size() endl;if (v.capacity() size) //判断是否扩容{cout 扩容了 endl;}while (it ! v.end()){cout *it ;it;}
}分析这是为什么呢不难发现vector是序列式容器在内存中是一块连续的内存当内存不足需要扩容时需要将原来的空间释放掉重新开辟一片连续的空间所以这样操作原来的迭代器相当于非法操作内存如果容器没有扩容的话只有itv.end()的迭代器失效那怎么解决呢只需要在每次在操作迭代器前重新给迭代器赋值。2.容器容量变化造成的迭代器失效void test2()
{vectorint vv;for (int i 0; i 10; i)vv.push_back(i);cout vv.size() vv.size() endl;cout vv.capacity() vv.capacity() endl;auto it vv.begin();cout after shrink_to_fit() endl;vv.shrink_to_fit();cout vv.size() vv.size() endl;cout vv.capacity() vv.capacity() endl;cout *it endl;
}3.被擦除的元素及之后的所有元素失效包括end()4. 被擦除元素及end()void test3()
{vectorint vv;for (int i 0; i 10; i)vv.push_back(i);auto it vv.end();cout after pop_back() endl;vv.pop_back();cout *it endl;
}