Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / C++STL:插入迭代器

迭代器是一个纯粹抽象概念:任何东西,只要其行为类似迭代器,它就是一个迭代器。C++标准库提供了数个预先定义的特殊迭代器,即迭代器适配器(iterator adapters)。它们不仅起辅助作用,还能赋予整个迭代器抽象概念更强大的能力。说明:适配器是使一事物的行为类似于另一事物的行为的一种机制。 插入器是一种迭代器适配器,带有一个容器参数,并生成一个迭代器,用于在指定容器中插入元素。通过插入迭代器赋值时,迭代器将会插入一个新元素。C++提供了三种插入器,其差别在于插入元素位置不同。1、back_inserter:创建使用push_back实现插入的迭代器。back_inserter内部调用push_back,在容器末尾插入元素。因此,只有在提供有push_back成员函数的容器中才能使用。这样的容器有:vector,deque,list。元素排列次序和安插次序相同。2、front_inserter:创建使用push_front实现插入的迭代器。front_inserter内部调用push_front,将元素安插于容器最前端。因此,只有在提供有push_front成员函数的容器中才能使用。这样的容器有:deque,list。元素排列次序和安插次序相反。3、inserter:创建使用insert实现插入的迭代器。Inserter内部调用insert,在它的迭代器实参所标明的位置前面插入元素。所有STL容器都提供insert成员函数,因此这是唯一可用于关联容器上的插入迭代器。元素排列次序和安插次序相同。说明:在关联容器中,你所给的位置只是一个提示,帮助它确定从什么地方开始搜寻正确的安插位置,如果提示不正确,效率上的表现会比没有提示更糟糕。下面给出一个例子:  1 #include <iostream>
 2 #include <vector>
 3 #include <list>
 4 #include <deque>
 5 #include <set>
 6 #include <algorithm>
 7 #include <iterator>                       
 8 using namespace std;
 9
10 int main(void)
11 {
12   list<int> coll1;
13   for (int i = 1; i <= 9; ++i)
14   {
15       coll1.push_back(i);
16   }
17
18   vector<int> coll2;
19   copy(coll1.begin(), coll1.end(), back_inserter(coll2));
20   for (int i = 0; i != coll2.size(); ++i)
21   {
22       cout << coll2[i] << " ";
23   }
24   cout << endl;
25
26   deque<int> coll3;
27   copy(coll1.begin(), coll1.end(), front_inserter(coll3));
28   for (int i = 0; i != coll3.size(); ++i)
29   {
30       cout << coll3[i] << " ";
31   }
32   cout << endl;
33
34   set<int> coll4;
35   copy(coll1.begin(), coll1.end(), inserter(coll4, coll4.begin()));
36   for (set<int>::iterator i = coll4.begin(); i != coll4.end(); ++i)
37   {
38       cout << *i << " ";
39   }
40   cout << endl;
41
42   return 0;
43 }说明:使用插入迭代器时要包含头文件iterator。输出结果如下:有人认为可以使用inserter和begin迭代器来模拟front_inserter,要注意的是使用inserter插入一个新元素后,该插入位置就不再是容器的首元素了。下面给出一个例子: 1 #include <list>
 2 #include <algorithm>
 3 #include <iterator>   
 4 #include <iostream>
 5 using namespace std;
 6
 7 int main(void)
 8 {
 9   list<int> coll1;
10   for (int i = 1; i <= 9; ++i)
11   {
12       coll1.push_back(i);
13   }
14
15   list<int> coll2;
16   copy(coll1.begin(), coll1.end(), inserter(coll2, coll2.begin()));            //模拟front_inserter
17   for (list<int>::iterator i = coll2.begin(); i != coll2.end(); ++i)
18   {
19       cout << *i << " ";
20   }
21   cout << endl;
22
23   return 0;
24 }输出结果如下:在复制创建coll2的过程中,元素在coll2中的固定位置插入,刚开始时,这个插入位置是此list对象的头部,但在插入一个元素后,就不再是首元素了。------------------------------分割线------------------------------C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码 http://www.linuxidc.com/Linux/2014-05/101227.htm读C++ Primer 之构造函数陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm读C++ Primer 之智能指针 http://www.linuxidc.com/Linux/2011-08/40177.htm读C++ Primer 之句柄类 http://www.linuxidc.com/Linux/2011-08/40175.htm将C语言梳理一下,分布在以下10个章节中:
  1. Linux-C成长之路(一):Linux下C编程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
  2. Linux-C成长之路(二):基本数据类型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
  3. Linux-C成长之路(三):基本IO函数操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
  4. Linux-C成长之路(四):运算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
  5. Linux-C成长之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
  6. Linux-C成长之路(六):函数要义 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
  7. Linux-C成长之路(七):数组与指针 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
  8. Linux-C成长之路(八):存储类,动态内存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
  9. Linux-C成长之路(九):复合数据类型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
  10. Linux-C成长之路(十):其他高级议题
本文永久更新链接地址:http://www.linuxidc.com/Linux/2015-02/113456.htm