2009-12-23 29 views
17

Sử dụng STL, tôi muốn tìm phiên bản cuối cùng của một giá trị nhất định trong một chuỗi.Có thuật toán STL để tìm phiên bản cuối cùng của một giá trị trong một chuỗi không?

Ví dụ này sẽ tìm thấy trường hợp đầu tiên của 0 trong một vectơ int.

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

typedef std::vector<int> intvec; 
intvec values; 
// ... ints are added to values 
intvec::const_iterator split = std::find(values.begin(), values.end(), 0); 

Bây giờ tôi có thể sử dụng split để làm những việc cho subranges begin() .. splitsplit .. end(). Tôi muốn làm một cái gì đó tương tự, nhưng với phân chia thành cuối cùng thể hiện của 0. Bản năng đầu tiên của tôi là sử dụng trình lặp ngược.

intvec::const_iterator split = std::find(values.rbegin(), values.rend(), 0); 

Điều này không hoạt động vì split là loại sai của trình lặp. Vì vậy, ...

intvec::const_reverse_iterator split = std::find(values.rbegin(), values.rend(), 0); 

Nhưng vấn đề bây giờ là tôi không thể làm cho "đầu" và "đuôi" dao động như begin(), splitsplit, end() vì những người không được đảo ngược vòng lặp. Có cách nào để chuyển đổi các iterator đảo ngược để chuyển tiếp tương ứng (hoặc truy cập ngẫu nhiên) iterator? Có cách nào tốt hơn để tìm phiên bản cuối cùng của một phần tử trong chuỗi sao cho tôi bị bỏ lại với một trình lặp tương thích?

Trả lời

23

Nhưng vấn đề bây giờ là tôi không có thể làm cho "đầu" và "đuôi" dao động sử dụng bắt đầu() và kết thúc() vì những người không phải lặp ngược lại.

reverse_iterator::base() là những gì bạn đang tìm kiếm - phần thành viên mới trên SGIs reverse_iterator description hoặc here on cppreference.com

+0

Tuyệt vời. Cảm ơn bạn! –

+1

Lưu ý rằng 'reverse_iterator :: base()' không trỏ đến cùng một phần tử, mà thay vào phần tử sau mục tìm thấy. Scott Meyer đã thể hiện tốt nhất trong hướng dẫn 3 trong bài viết này: http://www.ddj.com/cpp/184401406 – AFoglia

+1

[std :: reverse_iterator :: base] (http://en.cppreference.com/w/cpp/ mục nhập iterator/reverse_iterator/base) tại cppreference – maxschlepzig

6

gì về std::find_end? (Để tìm lần xuất hiện cuối cùng của chuỗi)

+1

+1 cho cách tiếp cận thú vị. Tìm kiếm các bước cuối cùng của một yếu tố chắc chắn sẽ làm việc. Nhưng chuyển đổi trình lặp ngược lại thành kiểu cơ sở của nó là hiệu quả hơn. –

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