advance() 函式詳細介紹
本節先講解 advance() 函式,其他函式後續章節會做詳細介紹。
C++ STL advance()函式
advance() 函式用於將迭代器前進(或者後退)指定長度的距離,其語法格式如下:
template <class InputIterator, class Distance> void advance (InputIterator& it, Distance n);
其中 it 指的是目標迭代器,n 通常為一個整數。
需要注意的是,如果 it 為輸入迭代器或者前向迭代器,則 n 必須為一個正數,即表示將 it 右移(前進) n 個位置;反之,如果 it 為雙向迭代器或者隨機訪問迭代器,則 n 為正數時表示將 it 右移(前進) n 個位置,n 為負數時表示將 it 左移(後退) n 個位置。
另外,根據 it 型別是否為隨機訪問迭代器,advance() 函式底層採用了不同的實現機制:
- 當 it 為隨機訪問迭代器時,由於該型別迭代器支援 p+n 或者 p-n(其中 p 就是一個隨機訪問迭代器)運算,advance() 函式底層採用的就是 it+n 操作實現的;
- 當 it 為其他型別迭代器時,它們僅支援進行 ++ 或者 -- 運算,這種情況下,advance() 函式底層是通過重複執行 n 個 ++ 或者 -- 操作實現的。
值得一提的是,advance() 函式定義在<iterator>
標頭檔案,並位於 std 名稱空間中。因此,程式在使用該函式之前,應包含如下 2 行程式碼:
#include <iterator> using namespace std;
第二行程式碼不是必須的,但如果不引用,則後續在使用 advance() 函式時,需要額外標註 std 名稱空間(強烈建議初學者使用)。
為了讓讀者更好地知曉 advance() 函式的功能,首先以 forward_list 容器(僅支援使用前向迭代器)為例,下面程式演示了 advance() 函式的功能:
#include <iostream> // std::cout #include <iterator> // std::advance #include <forward_list> using namespace std; int main() { //建立一個 forward_list 容器 forward_list<int> mylist{1,2,3,4}; //it為前向迭代器,其指向 mylist 容器中第一個元素 forward_list<int>::iterator it = mylist.begin(); //藉助 advance() 函式將 it 迭代器前進 2 個位置 advance(it, 2); cout << "*it = " << *it; return 0; }
程式執行結果為:
*it = 3
此程式中,由於 it 為前向迭代器,其只能進行 ++ 操作,即只能前進(右移),所以 advance() 函式的第 2 個引數只能為正數。
下面程式以 vector 容器為例,演示了 advance() 函式的功能:
#include <iostream> // std::cout #include <iterator> // std::advance #include <vector> using namespace std; int main() { //建立一個 vector 容器 vector<int> myvector{1,2,3,4}; //it為隨機訪問迭代器,其指向 myvector 容器中第一個元素 vector<int>::iterator it = myvector.begin(); //藉助 advance() 函式將 it 迭代器前進 2 個位置 advance(it, 2); cout << "1、*it = " << *it << endl; //繼續使用it,其指向 myvector 容器中最後一個元素之後的位置 it = myvector.end(); //藉助 advance() 函式將 it 迭代器後退 3 個位置 advance(it, -3); cout << "2、*it = " << *it; return 0; }
程式執行結果為:
1、*it = 3 2、*it = 2
注意,advance() 函式本身不會檢測 it 迭代器移動 n 個位置的可行性,如果 it 迭代器的移動位置超出了合理範圍,it 迭代器的指向將無法保證,此時使用 *it 將會導致程式崩潰。