迭代器适配器 | 功能 |
---|---|
back_insert_iterator | 在指定容器的尾部插入新元素,但前提必须是提供有 push_back() 成员方法的容器(包括 vector、deque 和 list)。 |
front_insert_iterator | 在指定容器的头部插入新元素,但前提必须是提供有 push_front() 成员方法的容器(包括 list、deque 和 forward_list)。 |
insert_iterator | 在容器的指定位置之前插入新元素,前提是该容器必须提供有 insert() 成员方法。 |
另外,back_insert_iterator 迭代器定义在 <iterator> 头文件,并位于 std 命名空间中,因此在使用该类型迭代器之前,程序应包含如下语句:C++ STL 标准库中,提供有 push_back() 成员方法的容器包括 vector、deque 和 list。
#include <iterator> using namespace std;
和反向迭代器不同,back_insert_iterator 插入迭代器的定义方式仅有一种,其语法格式如下:注意,第二行代码不是必需的,但如果不用,则程序中只要创建该类型的迭代器,就必须手动注明 std 命名空间(强烈建议初学者使用)。
std::back_insert_iterator<Container> back_it (container);
其中,Container 用于指定插入的目标容器的类型;container 用于指定具体的目标容器。//创建一个 vector 容器 std::vector<int> foo; //创建一个可向 foo 容器尾部添加新元素的迭代器 std::back_insert_iterator< std::vector<int> > back_it(foo);
在此基础上,back_insert_iterator 迭代器模板类中还对赋值运算符(=)进行了重载,借助此运算符,我们可以直接将新元素插入到目标容器的尾部。例如:当然,如果程序中已经引入了 std 命名空间,则以上程序中所有的 std:: 都可以省略。
#include <iostream> #include <iterator> #include <vector> using namespace std; int main() { //创建一个 vector 容器 std::vector<int> foo; //创建一个可向 foo 容器尾部添加新元素的迭代器 std::back_insert_iterator< std::vector<int> > back_it(foo); //将 5 插入到 foo 的末尾 back_it = 5; //将 4 插入到当前 foo 的末尾 back_it = 4; //将 3 插入到当前 foo 的末尾 back_it = 3; //将 6 插入到当前 foo 的末尾 back_it = 6; //输出 foo 容器中的元素 for (std::vector<int>::iterator it = foo.begin(); it != foo.end(); ++it) std::cout << *it << ' '; return 0; }程序执行结果为:
5 4 3 6
通过借助赋值运算符,我们依次将 5、4、3、6 插入到 foo 容器中的末尾。这里需要明确的是,每次插入新元素时,该元素都会插入到当前 foo 容器的末尾。换句话说,程序中 11-17 行的每个赋值语句,都可以分解为以下这 2 行代码://pos表示指向容器尾部的迭代器,value 表示要插入的元素 pos = foo.insert(pos,value); ++pos;可以看到,每次将新元素插入到容器的末尾后,原本指向容器末尾的迭代器会后移一位,指向容器新的末尾。
template <class Container>
back_insert_iterator<Container> back_inserter (Container& x);
std::back_insert_iterator< std::vector<int> > back_it = back_inserter(foo);通过接收 back_inserter() 的返回值,我们也可以得到完全一样的 back_it 插入迭代器。
有关此类型迭代器的底层实现,C++ STL back_insert_iterator官方手册给出了具体的实现代码,有兴趣的读者可自行前往查看。
另外,front_insert_iterator 迭代器定义在 <iterator> 头文件,并位于 std 命名空间中,因此在使用该类型迭代器之前,程序应包含如下语句:C++ STL 标准库中,提供有 push_front() 成员方法的容器,仅有 deque、list 和 forward_list。
#include <iterator> using namespace std;值得一提的是,定义 front_insert_iterator 迭代器的方式和 back_insert_iterator 完全相同,并且 C++ STL 标准库也提供了 front_inserter() 函数来快速创建该类型迭代器。
#include <iostream> #include <iterator> #include <forward_list> using namespace std; int main() { //创建一个 forward_list 容器 std::forward_list<int> foo; //创建一个前插入迭代器 //std::front_insert_iterator< std::forward_list<int> > front_it(foo); std::front_insert_iterator< std::forward_list<int> > front_it = front_inserter(foo); //向 foo 容器的头部插入元素 front_it = 5; front_it = 4; front_it = 3; front_it = 6; for (std::forward_list<int>::iterator it = foo.begin(); it != foo.end(); ++it) std::cout << *it << ' '; return 0; }程序执行结果为:
6 3 4 5
同样,C++ STL back_insert_iterator官方手册也给出了此类型迭代器底层实现的参考代码,有兴趣的读者可自行前往查看。
#include <iterator> using namespace std;不同之处在于,定义 insert_iterator 类型迭代器的语法格式如下:
std::insert_iterator<Container> insert_it (container,it);
其中,Container 表示目标容器的类型,参数 container 表示目标容器,而 it 是一个基础迭代器,表示新元素的插入位置。#include <iostream> #include <iterator> #include <list> using namespace std; int main() { //初始化为 {5,5} std::list<int> foo(2,5); //定义一个基础迭代器,用于指定要插入新元素的位置 std::list<int>::iterator it = ++foo.begin(); //创建一个 insert_iterator 迭代器 //std::insert_iterator< std::list<int> > insert_it(foo, it); std::insert_iterator< std::list<int> > insert_it = inserter(foo, it); //向 foo 容器中插入元素 insert_it = 1; insert_it = 2; insert_it = 3; insert_it = 4; //输出 foo 容器存储的元素 for (std::list<int>::iterator it = foo.begin(); it != foo.end(); ++it) std::cout << *it << ' '; return 0; }程序执行结果为:
5 1 2 3 4 5
C++ STL insert_iterator官方手册中给出了此类型迭代器底层实现的参考代码,有兴趣的读者可自行前往查看。
有关 copy() 函数的具体用法,由于不是本节重点,这里不再赘述,后续章节会做详细讲解。
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有