C++STL3 iterator&map

iterator

(引自C語言中文網)
要訪問順序容器和關聯容器中的元素,需要通過“迭代器(iterator)”進行。迭代器是一個變量,相當於容器和操縱容器的算法之間的中介。迭代器可以指向容器中的某個元素,通過迭代器就可以讀寫它指向的元素。從這一點上看,迭代器和指針類似。

定義

  1. 正向迭代器,定義方法如下:
    容器類名::iterator 迭代器名;

  2. 常量正向迭代器,定義方法如下:
    容器類名::const_iterator 迭代器名;

  3. 反向迭代器,定義方法如下:
    容器類名::reverse_iterator 迭代器名;

  4. 常量反向迭代器,定義方法如下:
    容器類名::const_reverse_iterator 迭代器名;

#include <iostream>
#include <vector>
using namespace std;
int main()
{
    vector<int> v;  //v是存放int類型變量的可變長數組,開始時沒有元素
    for (int n = 0; n<5; ++n)
        v.push_back(n);  //push_back成員函數在vector容器尾部添加一個元素
    vector<int>::iterator i;  //定義正向迭代器
    for (i = v.begin(); i != v.end(); ++i) {  //用迭代器遍歷容器
        cout << *i << " ";  //*i 就是迭代器i指向的元素
        *i *= 2;  //每個元素變爲原來的2倍
    }
    cout << endl;
    //用反向迭代器遍歷容器
    for (vector<int>::reverse_iterator j = v.rbegin(); j != v.rend(); ++j)
        cout << *j << " ";
        /*反向迭代器進行++操作後,會指向容器中的上一個元素。
        rbegin 成員函數返回指向容器中最後一個元素的迭代器,
        rend 成員函數返回指向容器中第一個元素前面的位置的迭代器,
        因此本循環實際上是從後往前遍歷整個數組。*/
    return 0;
}

程序的輸出結果是:
0 1 2 3 4
8 6 4 2 0

分類

  1. 正向迭代器。假設 p 是一個正向迭代器,則 p 支持以下操作:++p,p++,*p。此外,兩個正向迭代器可以互相賦值,還可以用==和!=運算符進行比較。

  2. 雙向迭代器。雙向迭代器具有正向迭代器的全部功能。除此之外,若 p 是一個雙向迭代器,則–p和p–都是有定義的。–p使得 p 朝和++p相反的方向移動。

  3. 隨機訪問迭代器。隨機訪問迭代器具有雙向迭代器的全部功能。若 p 是一個隨機訪問迭代器,i 是一個整型變量或常量,則 p 還支持以下操作:
    p+=i:使得 p 往後移動 i 個元素。
    p-=i:使得 p 往前移動 i 個元素。
    p+i:返回 p 後面第 i 個元素的迭代器。
    p-i:返回 p 前面第 i 個元素的迭代器。
    p[i]:返回 p 後面第 i 個元素的引用。

基本可以按照指針去理解辣~~~

  • 兩個隨機訪問迭代器 p1、p2 還可以用 <、>、<=、>= 運算符進行比較。p1<p2的含義是:p1 經過若干次(至少一次)++操作後,就會等於 p2。其他比較方式的含義與此類似。

  • 隨機訪問迭代器 p1、p2,表達式p2-p1返回值是 p2 所指向元素和 p1 所指向元素的序號之差(也可以說是 p2 和 p1 之間的元素個數減一)。

在這裏插入圖片描述

支持的函數

注意要頭文件#include <algorithm>
advance(p, n):使迭代器 p 向前或向後移動 n 個元素。向後正數,向前負數
distance(p, q):計算兩個迭代器之間的距離,即迭代器 p 經過多少次 + + 操作後和迭代器 q 相等。如果調用時 p 已經指向 q 的後面,則這個函數會陷入死循環。
iter_swap(p, q):用於交換兩個迭代器 p、q 指向的值。

map

大部分轉自這裏
頭文件#include <map>
map是STL的一個關聯容器,它提供一對一的hash。

第一個可以稱爲關鍵字(key),每個關鍵字只能在map中出現一次
第二個可能稱爲該關鍵字的值(value);
map容器裏面的元素類型就是pair

定義

map<int, int> mp;
map<char,int> mymap;

插入

  • 使用下標
 mymap['b'] = 100;
 mymap['a'] = 200;
 mymap['c'] = 300;
  • 使用insert函數
mp.insert(make_pair('a', 1));

mapStudent.insert(pair<int, string>(000, "student_zero"));

遍歷

  map<int, int>::iterator it;
        for (it = mp.begin(); it != mp.end(); it++){
                printf("%d-->%d\n", it->first, it->second);
        }
//轉自CSDN博主「zhiyong_will」

判空,容量

mymap.empty()
mymap.size()

查找,讀取

  • 返回value值:採用下標的方法讀取map中元素時(若map中不存在該元素,則會在map中插入)
  • 查找該元素是否存在:可以使用函數count(k),該函數返回的是k出現的次數;
  • 若是想取得key對應的值,可以使用函數find(k),該函數返回的是指向該元素的迭代器。
    it_find = mp.find(0);

刪除

從map中刪除元素的函數是erase(),該函數有如下的三種形式:

m.erase(k)
m.erase(p)
m.erase(b, e)

第一種方法刪除的是m中鍵爲k的元素,返回的是刪除的元素的個數;第二種方法刪除的是迭代器p指向的元素,返回的是void;第三種方法刪除的是迭代器b和迭代器e範圍內的元素,返回void。

其他

  • swap()交換
    mymap.swap(mp)
  • clear()map容器中刪除所有元素(已銷燬),使容器的大小爲0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章