初学者的我在学习迭代器的时候(今天这里主要说的是vector的迭代器)碰到了一些问题,纠结了好些时候,总算弄明白了一点。
迭代器会在删除插入等操作后失效,即在其删除插入位置后的迭代器会失效,那所谓的失效是什么意思?
失效一般是指迭代器指向了和你预期不一样的位置了,但这个时候,你可以通过自增自减使它指向正确位置,但是,注意,有些时候,你是不能这样做的,迭代器会完全失效,必须重新初始化。
迭代器像指针但又不是指针,指针是指向某个地之后,除非你改变它的指向,要不然它是不会因为其他操作使它的指向发生变化的,迭代器不一样,在删除插入后它的指向是会变化的,尤其是插入(迭代器有点像浮动的游标)
例如:
std::vector data;
std::vector::iterator i;
data.erase(i);
erase之后,i失效;
这里的失效,其实你在IDE中调试监视i看的话会发现,i只是指向了删除后的元素,并没有发生什么,但是在这之后你就是不能用它,一用它就会报错,而必须这样:i=data.erase(i)//i指向了被删除前的下一个元素;这样,你就可以用了。
其实删除还好,它并没有改变向量在内存的存储位置,你只要像上边这样做既可(或许重新初始化i),而插入有时就比较严重了:vector是支持动态插入的,什么是动态插入呢?就是原先分配给这个vector的内存如果不够的话,你再插入,能成功,但其实这个时候,插入后的vertor内存地址完全改变了,这样,原先的迭代器全部失效,必须重新初始化。你做插入动作,vector分配到的内存不够,这个时候系统会重新开辟一个内存空间(你在初始化vector的时候系统会自动开辟内存存储它,这个时候系统给它的内存空间你可以用vectorName.capacity()来查看他的大小,不过系统一般使capacity是等于size的,除非你手动初始化它),将原先vector的值复制过来,再执行插入操作,这样,你原先的迭代器就全部失效(因为地址完全改变了),不能再用了。
但如果你插入后,vector分配到的内存是够的,迭代器就不会“失效”,这里不会“失效”,是指vector还在这段内存上,只是插入后,插入位置后的迭代器指向了前一个元素,有点像删除,这个时候你只要执行“--i;”语句就可以使i回到原先位置
但是,重要的来了,迭代器这里你一定要重点关注下这个:iteratorName.end();这个位置很特殊,它无论是你删除也好,插入也好,一旦执行了这个操作之后,它是完全无效了的,它不会因为删除而指向后一个元素(这个好理解,后面是未定义的,当然不能),也不会因为插入而指向前一个元素(如果不是end位置,内存足够的话,插入后,这个位置后的迭代器是变成指向前一个元素的,并没有完全失效)。
说了这么多,还是看一个比较典型的程序,更好说明:
01 #include 02 #include 03 #include 04 #include 05 #include 06 #include 07 08 int main() 09 { 10 int v; 11 std::string s; 12 std::vector data; 13 std::vector::iterator i,p; 14 data.insert(data.begin(),std::istream_iterator(std::cin),std::istream_iterator>()); 15 i=data.begin(); 16 while(i!=data.end()) 17 { 18 v=*i; 19 p=std::lower_bound(data.begin(),i,v);//从向量begin()开始,到i中找到值大于等于v的第一个迭代器(p) 20 i=data.erase(i);//删除i,并返回指向下一个元素的迭代器 21 data.insert(p,v);//在p位置之前插入数据v 22 ++i; 23 } 24 for(std::vector>::iterator iter(data.begin());iter!=data.end();++iter) 25 std::cout
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?