欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STL容器迭代器的理解

程序员文章站 2024-03-22 10:20:05
...

迭代器

迭代器模式:就是提供一种方式,不用暴露出容器内部结构,就可以通过迭代器来访问容器内部元素。
迭代器:迭代器是类模板,表现的像一个指针,一个可以对其执行类似于指针的操作(如:解引用operator*()和递增operator++())的对象,但是又不同与指针,我们可以理解为指针的一层封装。


1.定义以及初始化
每一种容器都提供了自己的迭代器,我们以vector为例:

vector<int>::iterator iter; //定义一个名为iter的迭代器变量

2.迭代器范围
一个迭代器范围由一对迭代器组成,两个迭代器分别指向同一个容器中的元素或者尾元素之后的位置,通常被称为beginend,他们表示了容器中元素的一个范围。

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 << " ";
    }

STL容器迭代器的理解
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)来获取下一个有效迭代器