首先注意使用插入迭代器时头文件为
include <iterator>
泛型算法有很多,大多数都定义在:( 例如copy() )
#include<algorithm>
#include<numeric>
本文的思路为通过拷贝算法copy(),引出插入迭代器的使用,如无需了解此算法,请看本文后半部分
拷贝算法:接受三个迭代器参数,前两个表示输入的范围,第三个表示目的序列起始位位置。此算法将输入范围的元素拷贝到目的序列,传入给copy的目的序列至少要包含与输入序列一样多的元素。
copy()
list<int> A{0,1,2,3};
list<int>B(4);
copy(A.begin(), A.end(),B.begin());
for (auto &b : B)
{
cout << b << endl;
}//输出0,1,2,3
上面的代码中指定B的大小与A相同,若为空向量则会出严重错误
list<int> A{0,1,2,3};
list<int>B;//空向量
copy(A.begin(), A.end(),B.begin());//灾难:B中没有4的空间
for (auto &b : B)
{
cout << b << endl;
}
若我们想向一个空的容器进行泛型操作呢?
先看一段代码:
list<int> A{0,1,2,3};
list<int>B;
copy(A.begin(), A.end(),back_inserter(B));//相当于对B进行push_back操作
for (auto &b : B)
{
cout << b << endl;
}//输出0,1,2,3
引入:插入迭代器
插入迭代器:一种迭代器适配器,接收一个容器,向其中插入元素并返回一个迭代器。
有三种类型,区别在于插入元素的位置:
插入迭代器 | 内容 |
---|---|
back_inserter() | 创建一个使用push_back的迭代器 |
front_inserter() | 创建一个使用push_frount的迭代器 |
inserter() | 创建一个使用insert的迭代器,此函数的第一个参数为容器第二个参数为一个指向给定容器的迭代器。元素将被插入到该迭代器之前。 |
front_inserter()
list<int> A{0,1,2,3};//list支持push_front,因此可以用front_inserter() vecter就会报错
list<int>B;
copy(A.begin(), A.end(),front_inserter(B));
for (auto &b : B)
{
cout << b << endl;
}//输出的结果为 3,2,1,0
inserter()
list<int> A{0,1,2,3};
list<int>B;
copy(A.begin(), A.end(),inserter(B,B.begin()));
for (auto &b : B)
{
cout << b << endl;
}//输出的结果为 0,1,2,3
back_inserter()
list<int> A{0,1,2,3};
list<int>B;
copy(A.begin(), A.end(),front_inserter(B));
for (auto &b : B)
{
cout << b << endl;
}//输出的结果为 0,1,2,3