C++在传参时,如果传递两个Vector类型的参数时我是写的不对嘛,因为总感觉在我只传一个Vector的时候就不会报错,传了两个的时候,就会报错,不知道什么地方出了问题。试了一个简单的例子:
①. 会引起其底层空间改变的操作, 都有可能是迭代器失效, 比如: resize、reserve、insert、assign、push_back等.
出错原因:
以上操作, 都有可能会导致vector扩容, 也就是说vector底层原来旧空间被释放掉, 而在打印时, it还使用的是释放之间的旧空间, 在对it迭代器操作时, 实际操作的是一块已经被释放的空间, 而引起代码运行时崩溃.
②. 指定位置元素的删除操作--erase.
出错原因:
erase删除pos位置元素后, pos位置之后的元素会往前搬移, 没有导致底层空间的改变, 理论上讲迭代器不应该会失效, 但是: 如果pos刚好是最后一个元素, 删完之后pos刚好是end的位置, 而end位置是没有元素的, 那么pos就失效了. 因此删除vector中任意位置上元素时, vs就认为该位置迭代器失效了.(vector的删除操作不光会导致指向被删除元素的迭代器失效,删除元素后面的迭代器也会失效)
③. 当我们使用swap时也有可能会导致迭代器失效.
出错原因:
当我们创建两个vector对象时, 分别创建两个对象的begin()迭代器it_1,it_2, 我们使用swap对两个对象进行交换,交换完之后,it_1指向第二个对象, it_2指向第一个对象,这时如果你再使用it_1去操作第一个对象或者使用it_2去操作第二个对象就会发生错误.
迭代器失效的解决办法?
在使用前, 对迭代器重新赋值即可.