STL容器迭代器的理解

迭代器

迭代器模式:就是提供一种方式,不用暴露出容器内部结构,就可以通过迭代器来访问容器内部元素。
迭代器:迭代器是类模板,表现的像一个指针,一个可以对其执行类似于指针的操作(如:解引用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 << " ";
    }

这里写图片描述
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)来获取下一个有效迭代器

猜你喜欢

转载自blog.csdn.net/qqkb1016/article/details/81407058
今日推荐