STL容器迭代器的理解
程序员文章站
2024-03-22 10:20:05
...
迭代器
迭代器模式:就是提供一种方式,不用暴露出容器内部结构,就可以通过迭代器来访问容器内部元素。
迭代器:迭代器是类模板,表现的像一个指针,一个可以对其执行类似于指针的操作(如:解引用operator*()和递增operator++())的对象,但是又不同与指针,我们可以理解为指针的一层封装。
1.定义以及初始化
每一种容器都提供了自己的迭代器,我们以vector为例:
vector<int>::iterator iter; //定义一个名为iter的迭代器变量
2.迭代器范围
一个迭代器范围由一对迭代器组成,两个迭代器分别指向同一个容器中的元素或者尾元素之后的位置,通常被称为begin和end,他们表示了容器中元素的一个范围。
vector<int>v1;
vector<int>::iterator iter1=v1.begin();//将iter1迭代器初始化为指向v1的第一个元素
vector<int>::iterator iter2=v1.end();//将iter2迭代器初始化为指向v1的最后一个元素的下一个位置
- 如果begin和end相等,则范围为空。
- 如果begin和end不等,则至少包含一个元素,且begin指向该范围的第一个元素
- 我们可以对begin递增若干次,使begin==end
3.通过迭代器来遍历容器元素
vector<int>v;
for (int i = 0; i < 10; ++i)
{
v.push_back(i);
}
vector<int>::iterator it=v.begin();
for (; it < v.end(); ++it)
{
cout << *it << " ";
}
4.迭代器失效
经过学习STL容器,我们都知道,容器一般都会支持insert以及erase,但是经过这两个操作在一定程度上会导致迭代器失效的问题。
- vector
- 在经过push_back操作后,会使end返回的迭代器失效
- 在进行insert和erase之后,会使当前位置的迭代器以及之后的所有迭代器失效
- 当进行push_back后,如果capacity发生变化,则会使所有的迭代器失效
- List、map、set
- 作为空间不连续的容器,在进行insert和erase之后,只会使当前迭代器失效
- deque
- 在首部或者尾部插入元素都不会使任何迭代器失效
- 在其头部或尾部删除元素只会使当前迭代器失效
- 在其任何节点删除和插入都会使所有迭代器失效
5.如何解决迭代器失效?
经过翻看《STL源码剖析》之后,经过erase之后,都会返回下一个有效位置的迭代器,因此我们可以通过
iter=v1.erase(iter)来获取下一个有效迭代器
推荐阅读
-
STL容器迭代器的理解
-
Java总结05 Java集合体系.最高集合接口Collection和其迭代器/一般集合接口List和其迭代器/增强版For循环的应用
-
详解Java中Iterator迭代器的用法
-
详解Java中Iterator迭代器的用法
-
深入理解Java的Spring框架中的IOC容器
-
深入理解Java的Spring框架中的IOC容器
-
详解Java中的迭代迭代器Iterator与枚举器Enumeration
-
java集合迭代器Iterator中的remove陷阱
-
详解Java中的迭代迭代器Iterator与枚举器Enumeration
-
java集合迭代器Iterator中的remove陷阱