2013-05-17 24 views
13

tôi có mã như:C++ stl những gì hiện cơ sở() làm

vector <int> v; 
for (int i=0; i<5; i++) 
     v.push_back(i); 
v.erase(find(v.rbegin(), v.rend(),2).base()); 

Mã này xóa phần tử đầu tiên từ vector v sau khi phát hiện đầu tiên 2 (trong vector vẫn: 0 1 2 4). .base() làm gì ở đây?

+0

Có thể bạn nên đọc điều này: http://www.cplusplus.com/reference/iterator/reverse_iterator/base/ – JBL

Trả lời

22

base() chuyển đổi một iterator ngược vào iterator tương ứng về phía trước. Tuy nhiên, mặc dù sự đơn giản của nó, sự tương ứng này không phải là tầm thường như một điều có thể.

Khi một điểm iterator ngược tại một phần tử, nó dereferences trước đó, vì vậy các phần tử nó chất điểm đến và các yếu tố đó logic điểm đến khác nhau. Trong sơ đồ sau đây, i là một iterator về phía trước, và ri là một iterator ngược xây dựng từ i:

       i, *i 
          | 
    -  0  1  2  3  4  - 
         |  | 
         *ri ri 

Vì vậy, nếu ri logic chỉ ra yếu tố 2, nó thể chất trỏ tới yếu tố 3. Do đó, khi được chuyển đổi thành một trình vòng lặp chuyển tiếp, trình lặp kết quả sẽ trỏ đến phần tử 3, là một biến được loại bỏ trong ví dụ của bạn.

sau Chương trình nhỏ thể hiện các hành vi trên:

#include <iostream> 
#include <vector> 
#include <iterator> 
#include <algorithm> 

int main(int argc, char *argv[]) 
{ 
    std::vector<int> v { 0, 1, 2, 3, 4 }; 
    auto i = find(begin(v), end(v), 2); 

    std::cout << *i << std::endl; // PRINTS 2 

    std::reverse_iterator<decltype(i)> ri(i); 
    std::cout << *ri << std::endl; // PRINTS 1 
} 

Đây là một live example.

8

base() trả về trình lặp cơ sở cơ sở.

Trình lặp cơ sở đề cập đến phần tử bên cạnh phần tử số reverse_iterator hiện trỏ đến. Đó là std::reverse_iterator(it).base() == std::next(it).

Bạn có thể tìm hiểu thêm về reverse_iteratorhere.

enter image description here

Các vấn đề liên quan