持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
(欢迎大家关注我的微信公众号——控制工程研习,上面会分享很多我学习过程中总结的笔记。)
你知道STL迭代器的失效情况有哪些吗?(题目来自理想汽车C++面试题)
当使用一个容器的insert或者erase函数通过迭代器插入或删除元素"可能"会导致迭代器失效,
迭代器失效的类型:
(1)由于插入元素,使得容器元素整体“迁移”导致存放原容器元素的空间不再有效,从而使得指向原空间的迭代器失效。
(2)由于删除元素使得某些元素次序发生变化使得原本指向某元素的迭代器不再指向希望指向的元素。
序列式容器
vector
(1)当插入(push_back)一个元素后,end操作返回的迭代器肯定失效。
(2)当插入(push_back)一个元素后,capacity返回值与没有插入元素之前相比有改变,则需要重新加载整个容器,此时first和end操作返回的迭代器都会失效。
(3)当进行删除操作(erase,pop_back)后,指向删除点的迭代器全部失效;指向删除点后面的元素的迭代器也将全部失效。
deque
(1)在deque容器首部或者尾部插入元素不会使得任何迭代器失效。
(2)在其首部或尾部删除元素则只会使指向被删除元素的迭代器失效。
(3)在deque容器的任何其他位置的插入和删除操作将使指向该容器元素的所有迭代器失效。
链表式容器:
list
(1)插入操作(insert)和接合操作(splice)不会造成原有的list迭代器失效,这在vector中是不成立的,因为vector的插入操作可能造成记忆体重新配置,导致所有的迭代器全部失效。
(2)list的删除操作(erase)也只有指向被删除元素的那个迭代器失效,其他迭代器不受影响。
关联式容器
set和map
(1)与list相同,当对它进行insert和erase操作时,操作之前的所有迭代器,在操作完成之后都依然有效,但被删除的元素的迭代器失效。