C++深入学习笔记(19)—— 迭代器

  iterator头文件中,除了为每个容器所定义的迭代器外,标准库中还额外定义了其它的迭代器类型,如下。

插入迭代器(inset iterator):该类迭代器被绑定到一个容器上,可用来向容器中插入元素。
流迭代器(stream iterator):该类迭代器被绑定到输入或者输出流上,可以用来遍历有关联的IO流。
反向迭代器(reverse iterator):这些迭代器向后移动而不是向前移动。除了forward_list之外的标准库容器都有反向迭代器。(从头至尾的方向为前,从尾至头的方向为后。)

插入迭代器

  插入迭代器是一种迭代器适配器,它接受一个容器类型,能够向容器中添加元素。当我们对插入迭代器进行赋值时,并不是将值赋给迭代器所指向的对象,而是将该值插入到容器中。

  插入迭代器有以下三类型:

back_inserter:创建一个使用push_back的迭代器类型;
front_inserter:创建一个使用push_front的迭代器类型;
inserter:创建一个使用insert的迭代器类型;该迭代器在绑定容器的时候要接受第二个参数,这个参数必须是指向给定容器的迭代器,元素将插入到给定迭代器所表示的元素之前。

  理解插入迭代器的执行过程是非常重要的,下面将用代码来解释和演示插入迭代器的三种类型。

inserter迭代器的执行过程

vector<int> ivec = {
   1, 3, 5, 7, 9};
auto it = insert(ivec, ++ivec.begin());		// 指向3;
*it = 2;
*it = 4;
for(const auto &elem : ivec)
	cout << elem << "  ";
// 输出为1  2  4  3  5  7  9 

  这个过程可能有些难以理解,不是说插在当前值前面吗?我们知道,当对容器进行插入,删除等操作时,原来的指针、迭代器会失效,因为它们指向的是原来的位置,而不是原来的值。我们可以在第三行在3前面插入2,迭代器原本指向的位置的值右3变成了2,第四行应该在2前面插入4,为什么仍然在3前面插入4呢?

  所以说,我们要了解inserter迭代器执行的过程。

*it = 2;		// 执行该语句时,可以将过程等效为下面的过程

it = ivec.insert(it, 2);		// 在it的位置前插入2,it指向2
++it;		// it指向原来的元素,即3,这样再插入4的时候就是在3前面插入了

back_inserter迭代器的执行过程

vector<int> ivec = {
   1, 3, 5, 7, 9};
auto bt = back_inserter(ivec);
*bt = 11;
*bt = 13
for(const auto &elem : ivec)
	cout << elem << "  ";
// 输出为1, 3, 5, 7, 9, 11, 13

  我们该如何理解第三行和第四行的句子呢?上面说了,back_insertor迭代器使用push_back,结果相当于执行了ivec.push_back()函数。<

你可能感兴趣的:(C++深入学习笔记,c++,容器,开发语言)