C++ STL prev()和next()函數(深入了解,一文學會)


轉自:https://blog.csdn.net/qq_37529913/article/details/120008481

C++ STL advance()函數(深入了解,一文學會)》一節中,詳細講解了 advance() 函數的功能,其可以將指定迭代器前移或后移 n 個位置的距離。

 

C++ STL prev()和next()函數(深入了解,一文學會)目錄

1 advance() 函數移動的是源迭代器

2 prev()函數

3 next()函數

1 advance() 函數移動的是源迭代器
但值得一提的是,advance() 函數移動的是源迭代器,舉個例子:

#include <iostream>     // std::cout
#include <iterator>     // std::advance
#include <vector>
using namespace std; //創建一個 vector 容器
vector<int> myvector{ 1,2,3,4 }; //it為隨機訪問迭代器,其指向 myvector 容器中第一個元素
vector<int>::iterator it = myvector.begin(); //輸出 it 迭代器指向的數據
cout << "移動前的 *it = " << *it << endl; //借助 advance() 函數將 it 迭代器前進 2 個位置
advance(it, 2); cout << "移動后的 *it = " << *it << endl;

 

通過程序的運行結果不難看出,advance() 函數沒有任何返回值,其移動的是 it 迭代器本身。

這就產生一個問題,若我們不想移動 it 迭代器本身,而僅僅是想在 it 迭代器的基礎上,得到一個移動指定位置的新迭代器,顯然 advance() 函數是不合適的,這時就可以使用 C++ STL 標准庫提供的另外 2 個函數,即 prev() 和 next() 函數。

2 prev()函數
prev 原意為“上一個”,但 prev() 的功能遠比它的本意大得多,該函數可用來獲取一個距離指定迭代器 n 個元素的迭代器。

prev() 函數的語法格式如下:

template <class BidirectionalIterator>
BidirectionalIterator prev (BidirectionalIterator it, typename iterator_traits<BidirectionalIterator>::difference_type n = 1);

其中,it 為源迭代器,其類型只能為雙向迭代器或者隨機訪問迭代器;n 為指定新迭代器距離 it 的距離,默認值為 1。該函數會返回一個距離 it 迭代器 n 個元素的新迭代器。

注意,當 n 為正數時,其返回的迭代器將位於 it 左側;反之,當 n 為負數時,其返回的迭代器位於 it 右側。

 

#include <iostream>     // cout
#include <iterator>     // next
#include <list>         // list
using namespace std; //創建並初始化一個 list 容器
list<int> mylist{ 1,2,3,4,5 }; list<int>::iterator it = mylist.end(); //獲取一個距離 it 迭代器 2 個元素的迭代器,由於 2 為正數,newit 位於 it 左側
auto newit = prev(it, 2); cout << "prev(it, 2) = " << *newit << endl; //n為負數,newit 位於 it 右側
it = mylist.begin(); newit = prev(it, -2); cout << "prev(it, -2) = " << *newit;

 

可以看到,當 it 指向 mylist 容器最后一個元素之后的位置時,通過 prev(it, 2) 可以獲得一個新迭代器 newit,其指向的是距離 it 左側 2 個元素的位置(其存儲的是元素 4);當 it 指向 mylist 容器中首個元素時,通過 prev(it, -2) 可以獲得一個指向距離 it 右側 2 個位置處的新迭代器。

注意,prev() 函數自身不會檢驗新迭代器的指向是否合理,需要我們自己來保證其合理性。

3 next()函數
和 prev 相反,next 原意為“下一個”,但其功能和 prev() 函數類似,即用來獲取一個距離指定迭代器 n 個元素的迭代器。

next() 函數的語法格式如下:

template <class ForwardIterator>
ForwardIterator next (ForwardIterator it, typename iterator_traits<ForwardIterator>::difference_type n = 1);

其中 it 為源迭代器,其類似可以為前向迭代器、雙向迭代器以及隨機訪問迭代器;n 為指定新迭代器距離 it 的距離,默認值為 1。該函數會返回一個距離 it 迭代器 n 個元素的新迭代器。

需要注意的是,當 it 為前向迭代器時,n 只能為正數,該函數最終得到的新迭代器位於 it 右側;當 it 為雙向迭代器或者隨機訪問迭代器時,若 n 為正數,則得到的新迭代器位於 it 右側,反之位於 it 左側。

 

#include <iostream>     // std::cout
#include <iterator>     // std::next
#include <list>         // std::list
using namespace std; //創建並初始化一個 list 容器
list<int> mylist{ 1,2,3,4,5 }; list<int>::iterator it = mylist.begin(); //獲取一個距離 it 迭代器 2 個元素的迭代器,由於 2 為正數,newit 位於 it 右側
auto newit = next(it, 2); cout << "next(it, 2) = " << *newit << endl; //n為負數,newit 位於 it 左側
it = mylist.end(); newit = next(it, -2); cout << "next(it, -2) = " << *newit;

 

可以看到,和 prev() 函數恰好相反,當 n 值為 2 時,next(it, 2) 函數獲得的新迭代器位於 it 迭代器的右側,距離 2 個元素;反之,當 n 值為 -2 時,新迭代器位於 it 迭代器的左側,距離 2 個元素。

注意,和 prev() 函數一樣,next() 函數自身也不會檢查新迭代器指向的有效性,需要我們自己來保證。

 


免責聲明!

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



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