迭代器整理
-
如果容器为空,begin、end均返回尾后迭代器。
-
迭代器操作:
- *iter:返回所指元素引用
- iter->mm:解引用iter并获取该元素名为mem的成员。等价于(*iter).mem
- ++iter、–iter
- iter1 == iter2、iter1 != iter2
-
若容器对象为const常量,则只能使用const_iterator,只读不可写;否则既可使用const_iterator也可使用iterator。
-
cbegin()、cend()返回常量迭代器。
-
迭代器失效:(增删元素可能会导致迭代器失效,修改元素不会)
- vector
- push_back(val)触发扩容,所有迭代器失效。
- insert(val)触发扩容,所有迭代器失效;insert(val)导致后面元素移动,后面被移动部分迭代器失效,前面不失效。
- erase(val)导致后面元素移动,后面被移动部分迭代器失效,前面不失效。
- deque
- 插删元素导致迭代器失效的情况较复杂,避免deque增删容器后仍使用原迭代器。详细内容参考其他大佬的博客。
- list
- 因存储空间不连续,使用链表来实现,因此插入、删除一个元素,不会导致其他迭代器失效。
- set、map
- 关联式容器使用红黑树实现,插入删除一个元素,不会导致其他迭代器失效。
- 解决方案:使用erase()、insert()等函数返回的新迭代器。
- vector
-
迭代器属性
-
所有迭代器都提供的属性:p++,*p,p = p1
-
输入迭代器:只读(额外提供:p == p1,p != p1)
-
输出迭代器:只写
-
正向迭代器:读写(提供输入输出迭代器的所有功能)
-
双向迭代器:读写(提供正向迭代器的所有功能,额外提供:p–)
-
随机访问迭代器:读写(提供双向迭代器的所有功能,额外提供:p += i,p + i,p[i] 返回元素引用,p < p1,p - p1 计算两迭代器间的距离,即元素个数)
vector、deque、string、array:5
list:4
forward_list:3
set、multiset:4
map、multimap:4
stack、queue、priority_queue:不支持迭代器
(find()方法至少需要输入迭代器;sort()方法至少需要随机访问迭代器)
-
1 | // 关于随机访问迭代器的 p[i],其中p为迭代器 |
- 反向迭代器
- 先翻转各元素位置,然后将反向迭代器当做正向迭代器处理。
- 流迭代器不支持递减运算;不可能从一个forward_list或一个流迭代器创建反向迭代器。
1 | // 向sort传递一对反向迭代器来实现递减排序 |
评论