2015-08-25 24 views
9

Tôi tự hỏi những lợi ích của việc sử dụng rbegin() thay vì kết thúc() - 1 là cho các container STL.Tại sao sử dụng rbegin() thay vì kết thúc() - 1?

Ví dụ, tại sao bạn sẽ sử dụng một cái gì đó như:

vector<int> v; 
v.push_back(999); 
vector<int>::reverse_iterator r = v.rbegin(); 
vector<int>::iterator i = r.base(); 

Thay vì:

vector<int> v; 
v.push_back(999); 
auto r = v.end() - 1; 
+2

Suy nghĩ về ' ', chẳng hạn như' std :: for_each (v.rbegin(), v.rend(), worker); '. – Nawaz

+0

lý do nào bạn sử dụng 'auto' trong ví dụ thứ hai? – UnKnown

+0

@ UnKnown Chỉ cần nhập ít ký tự hơn. –

Trả lời

17

rbegin() trả về trình lặp với đảo ngượcoperator++; có nghĩa là, với một reverse_iterator bạn có thể lặp qua một vùng chứa đi ngược.

Ví dụ:

#include <vector> 
#include <iostream> 

int main() 
{ 
    std::vector<int> v{0,1,2,3,4}; 
    for(auto i = v.rbegin(); i != v.rend(); ++i) 
     std::cout << *i << '\n'; 
} 

Bên cạnh đó, một số container tiêu chuẩn như std::forward_list, trở mong lặp, vì vậy bạn sẽ không thể làm l.end()-1.

Cuối cùng, nếu bạn phải chuyển trình lặp của bạn đến một số thuật toán như std::for_each giả sử sử dụng operator++, bạn buộc phải sử dụng reverse_iterator.

+0

Tôi đã nghĩ đến việc lặp lại ngược bằng cách sử dụng itr-- thay vì nó ++ để đảo ngược, nhưng việc sử dụng chức năng tích hợp có ý nghĩa hơn tôi đoán. Cảm ơn. –

+0

@VictorBrunell Đã cập nhật câu trả lời của tôi;) –

+0

Cảm ơn. Điều đó rất hữu ích. –

10

Nếu container rỗng, end() - 1 sẽ không được xác định.

+0

Vì vậy, đối với một vector phần tử, bắt đầu() và rbegin() trỏ đến cùng một phần tử? Tôi hiểu rồi. Cảm ơn. –

+3

@VictorBrunell: Có và không. Trình vòng lặp chuyển tiếp và trình lặp ngược không tương thích. Bạn không thể làm 'v.begin() == v.rbegin()'. Nhưng bạn có thể so sánh các phần tử mà chúng trỏ đến, tức là '& * (v.begin()) == & * (v.rbegin())' được xác định và sẽ đúng cho vectơ 1 phần tử. –

+0

Ah, thú vị. Cảm ơn. –

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