當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


C++ std::prev用法及代碼示例


std::prev前進一定數目後,返回指向元素的迭代器。方向相反的位置。它在頭文件中定義。

它返回參數的副本,該參數在向後的方向上前進了指定的數量。如果它是random-access迭代器,則該函數僅使用一次運算符+或運算符-進行前進。否則,該函數在複製的迭代器上重複使用遞增或遞減運算符(運算符++或運算符--),直到已推進n個元素。

用法:


BidirectionalIterator prev (BidirectionalIterator it,
       typename iterator_traits::difference_type n = 1);
it:Iterator to the base position.
difference_type: It is the numerical type that represents 
distances between iterators of the BidirectionalIterator type.
n:Total no. of positions by which the
iterator has to be advanced. In the syntax, n is assigned
a default value 1 so it will atleast advance by 1 position.

返回:It returns an iterator to the element 
n positions before it.

// C++ program to demonstrate std::prev 
#include <iostream> 
#include <iterator> 
#include <deque> 
#include <algorithm> 
using namespace std; 
int main() 
{ 
    // Declaring first container 
    deque<int> v1 = { 1, 2, 3, 4, 5, 6, 7 }; 
  
    // Declaring another container 
    deque<int> v2 = { 8, 9, 10 }; 
  
    // Declaring an iterator 
    deque<int>::iterator i1; 
  
    // i1 points to 1 
    i1 = v1.begin(); 
  
    // Declaring another iterator to store return 
    // value and using std::prev 
    deque<int>::iterator i2; 
    i2 = std::prev(v1.end(), 3); 
  
    // Using std::copy 
    std::copy(i1, i2, std::back_inserter(v2)); 
    // Remember, i1 stills points to 1 
    // and i2 points to 5 
    // v2 now contains 8 9 10 1 2 3 4 
  
    // Displaying v1 and v2 
    cout << "v1 = "; 
  
    int i; 
    for (i = 0; i < 7; ++i) { 
        cout << v1[i] << " "; 
    } 
  
    cout << "\nv2 = "; 
    for (i = 0; i < 7; ++i) { 
        cout << v2[i] << " "; 
    } 
  
    return 0; 
}

輸出:

v1 = 1 2 3 4 5 6 7
v2 = 8 9 10 1 2 3 4

How can it be helpful ?

  • 在列表中移動迭代器:由於list支持雙向迭代器,因此隻能使用++和--運算符進行遞增。因此,如果我們想將迭代器前進一個以上的位置,則為std::next;如果要遞減迭代器,則std::prev可能非常有用。
    // C++ program to demonstrate std::prev 
    #include <iostream> 
    #include <iterator> 
    #include <list> 
    #include <algorithm> 
    using namespace std; 
    int main() 
    { 
        // Declaring first container 
        list<int> v1 = { 1, 2, 3, 7, 8, 9 }; 
      
        // Declaring second container 
        list<int> v2 = { 4, 5, 6 }; 
      
        list<int>::iterator i1; 
        i1 = v1.begin(); 
        // i1 points to 1 in v1 
      
        list<int>::iterator i2; 
        // i2 = v1.end() - 3; 
        // This cannot be used with lists 
        // so use std::prev for this 
      
        i2 = std::prev(v1.end(), 3); 
      
        // Using std::copy 
        std::copy(i1, i2, std::back_inserter(v2)); 
        // v2 now contains 4 5 6 1 2 3 
      
        // Displaying v1 and v2 
        cout << "v1 = "; 
      
        int i; 
        for (i1 = v1.begin(); i1 != v1.end(); ++i1) { 
            cout << *i1 << " "; 
        } 
      
        cout << "\nv2 = "; 
        for (i1 = v2.begin(); i1 != v2.end(); ++i1) { 
            cout << *i1 << " "; 
        } 
      
        return 0; 
    }

    輸出:

    v1 = 1 2 3 7 8 9
    v2 = 4 5 6 1 2 3 
    

    說明:在這裏,請看一下如何隻複製列表的選定部分,然後才能使用std::prev,否則我們將無法使用帶有列表支持的雙向迭代器的+ =,-=運算符。因此,我們使用了std::prev並將迭代器從末尾直接向後移動了三個位置。

我們可以用嗎std::next代替std::prev?

std::prev可能引起的一個常見查詢是std::next也可以與負參數一起使用,以將迭代器向後移動。好吧,答案是肯定的。

// C++ program to demonstrate std::next 
#include <iostream> 
#include <iterator> 
#include <deque> 
#include <algorithm> 
using namespace std; 
int main() 
{ 
    // Declaring first container 
    deque<int> v1 = { 1, 2, 3, 4, 5, 6, 7 }; 
  
    // Declaring another container 
    deque<int> v2 = { 8, 9, 10 }; 
  
    // Declaring an iterator 
    deque<int>::iterator i1; 
  
    // i1 points to 1 
    i1 = v1.begin(); 
  
    // Declaring another iterator to store return 
    // value and using std::next 
    deque<int>::iterator i2; 
    i2 = std::next(v1.end(), -3); 
  
    // Using std::copy 
    std::copy(i1, i2, std::back_inserter(v2)); 
    // Remember, i1 stills points to 1 
    // and i2 points to 5 
    // v2 now contains 8 9 10 1 2 3 4 
  
    // Displaying v1 and v2 
    cout << "v1 = "; 
  
    int i; 
    for (i = 0; i < 7; ++i) { 
        cout << v1[i] << " "; 
    } 
  
    cout << "\nv2 = "; 
    for (i = 0; i < 7; ++i) { 
        cout << v2[i] << " "; 
    } 
  
    return 0; 
}

輸出:

v1 = 1 2 3 4 5 6 7
v2 = 8 9 10 1 2 3 4

說明:因此,我們僅使用std::next代替了std::prev,並將第二個參數從3更改為-3,它仍然具有相同的目的。

我們也可以使用std::next,但是有兩點需要牢記:

  • 由於std::next在其語法中有一個參數作為正向迭代器,因此如果我們要使用負數no。為了推進該迭代器,則它至少應為雙向迭代器。
  • 雖然,也可以使用std::next,但是當意圖專門向後移動時,std::prev()更具可讀性。


相關用法


注:本文由純淨天空篩選整理自 std::prev in C++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。