C++之inserter函数与插入迭代器

紫书5-5碰到这么个东西

#define all(s0) s0.begin(),s0.end()
#define ins(s0) inserter(s0,s0.begin())《----一开始不知道这个是什么
set_union(all(s1), all(s2), ins(sR));

苦查资料(期间还去图书馆借了本c++从入门到精通,初中看这一系列觉得难,现在反而觉得不够看了)发现
inserter第二个参数和他的返回值都是迭代器,但是由inserter函数返回的迭代器准确一点说应该是叫插入适配器
他和普通的迭代器有如下区别

vector<int> s{ 1, 2, 3,3 };
fill_n(s.begin(), 2, 5);输出5 5 3 3
fill_n(inserter(s,s.begin()), 2, 5);输出5 5 1 2 3 3

你看,本来是直接覆盖的,也就是访问内容,变成插入了,那这玩意到底是如何工作的呢?同样的迭代器为何它如此优秀呢?
看如下解释:
除了为每个容器定义的迭代器之外,标准库在头文件iterator中还定义了额外几种迭代器。这些迭代器包括以下几种。

  • 插入迭代器:这些迭代器被绑定到一个容器上,可用来向容器插入元素
  • 流迭代器:这些迭代器被绑定到输入或输出上,可用来遍历所有关联的IO流
  • 反向迭代器:这些迭代器向后而不是向前移动。除了forward_list之外的标准库容器都有反向迭代器
  • 移动迭代器:这些专用的迭代器不是拷贝其中的元素,而是移动它们。

为什么这些迭代器可以实现这么强的功能呢?

迭代器 如何工作
back_inserter(container) 返回尾部插入型迭代器,内部会调用容器container的push_back()方法来将数据插入容器的尾部
front_inserter(container) 返回头部插入型迭代器,内部会调用容器container的push_front()方法来将数据插入容器的头部
inserter(container,pos) 返回通用插入型迭代器,内部会调用容器container的insert(pos)方法将数据插入到pos位置。

猜你喜欢

转载自blog.csdn.net/m0_37456764/article/details/83019250