歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> 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成長之路(十):其他高級議題

Copyright © Linux教程網 All Rights Reserved