您的位置:首页 > 财经 > 产业 > 建站公司哪家好 都选万维科技_b2b典型代表网站_seo优化及推广如何运营_中文搜索引擎

建站公司哪家好 都选万维科技_b2b典型代表网站_seo优化及推广如何运营_中文搜索引擎

2024/12/27 0:03:10 来源:https://blog.csdn.net/2301_82135086/article/details/144177287  浏览:    关键词:建站公司哪家好 都选万维科技_b2b典型代表网站_seo优化及推广如何运营_中文搜索引擎
建站公司哪家好 都选万维科技_b2b典型代表网站_seo优化及推广如何运营_中文搜索引擎

迭代器失效

在这里插入图片描述

定义

​ 迭代器失效是指在使用迭代器遍历容器(如vectorlistmap等)的过程中,由于容器内部结构发生了变化,导致原来的迭代器不再有效,不能正确地指向它原本所指向的元素或者不能按照预期的方式进行遍历。

以 vector 为例说明

插入操作导致的迭代器失效

​ 当在vector中插入元素时,如果插入操作导致了内存重新分配,那么所有指向该vector的迭代器都会失效。这是因为vector的存储是连续的内存空间,当插入元素使得当前容量不够时,vector会重新分配一块更大的内存空间,将原来的元素复制或移动到新的空间中,原来的迭代器所指向的内存地址就不再有效

例:

#include <iostream>
#include <vector>
int main() {std::vector<int> v = {1, 2, 3};auto it = v.begin();v.push_back(4);  // 插入元素可能导致内存重新分配// 此时it可能已经失效,下面的操作可能会导致程序出错std::cout << *it << std::endl;return 0;
}

调整一下:

删除操作导致的迭代器失效

​ 在vector中删除元素后,被删除元素之后的迭代器都会失效。这是因为删除元素会导致后面的元素向前移动,迭代器原本指向的元素位置发生了改变。

如:

#include <iostream>
#include <vector>
int main() {std::vector<int> v = {1, 2, 3, 4};auto it = v.begin() + 1;  // 指向元素2v.erase(it);  // 删除元素2// 此时it已经失效,下面的操作可能会导致程序出错std::cout << *it << std::endl;return 0;
}

以 list 为例说明

插入操作

​ 对于list容器,插入操作不会导致迭代器失效。因为list是由节点组成的链表结构,插入新节点只是修改节点之间的链接关系,迭代器指向的节点本身并没有改变。

​ 例如:

#include <iostream>
#include <list>
int main() {std::list<int> l = {1, 2, 3};auto it = l.begin();l.insert(it, 0);  // 在头部插入元素0std::cout << *it << std::endl;  // it仍然有效,输出1return 0;
}
删除操作

​ 在list中删除一个元素后,只有指向被删除元素的迭代器会失效。其他迭代器不受影响,因为链表结构的特点使得删除操作只是调整节点之间的连接,不会像vector那样引起其他元素的移动。

​ 例如:

#include <iostream>
#include <list>
int main() {std::list<int> l = {1, 2, 3};auto it = l.begin();l.erase(it);  // 删除第一个元素1// it已经失效,不能再使用// 可以重新获取迭代器来遍历for (auto new_it = l.begin(); new_it!= l.end(); ++new_it) {std::cout << *new_it << std::endl;}return 0;
}

​ 又如:

在关联容器中的情况

​ 对于关联容器(以map为例),插入操作不会导致迭代器失效,因为插入新元素只是在红黑树(map通常的底层实现)中添加一个节点,不会改变已有节点的地址。
​ 删除操作会导致指向被删除元素的迭代器失效,但其他迭代器仍然有效,因为红黑树的结构调整不会影响其他节点的内存位置。
​ 例如:

#include <iostream>
#include <map>
int main() {std::map<int, int> m = {{1, 10}, {2, 20}};auto it = m.find(1);m.erase(it);  // 删除键为1的元素// it已经失效,不能再使用for (auto new_it = m.begin(); new_it!= m.end(); ++new_it) {std::cout << new_it->first << " " << new_it->second << std::endl;}return 0;
}

本文结束。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com