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 將會導致程序崩潰。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM