2010-02-28 29 views
11

Hiện tại tôi sử dụng một trình vòng lặp để tìm kiếm thông qua một vectơ và kiểm tra các phần tử của nó. Tôi truy cập các yếu tố bằng cách sử dụngTôi có thể làm số học con trỏ trên một STL :: vector :: iterator

std::vector<int>::iterator it; 
if (*it == 0); 

Tôi có thể sử dụng cùng một lôgic kiểu số học để kiểm tra thành phần tiếp theo (mà không thay đổi trình lặp của tôi) không?

đầu tiên tôi cần phải xem nếu nó sẽ đẩy iterator ngoài giới hạn

if (it != myvec.end()) 

Sau đó kiểm tra cả hai yếu tố hiện tại và phần tử tiếp theo

if (*it == 1 && *(it + 1) == 1) 

Sẽ làm việc này như tôi mong đợi từ việc sử dụng con trỏ?

Trả lời

16

Có, các trình vòng lặp cho std::vectorrandom access iterators để bạn thêm/trừ các giá trị tích phân để nhận các trình lặp hợp lệ khác.

Về mặt kỹ thuật, nó có thể không phải là số học con trỏ, nhưng chúng hoạt động giống như con trỏ.

+0

Vì vậy, tôi không thể thực hiện phép toán số học trên 'list :: iterator', phải không? – Alcott

+1

@Alcott - đúng. Một danh sách :: iterator là một trình vòng lặp hai chiều và không hỗ trợ truy cập ngẫu nhiên. Bạn có thể sử dụng 'std :: advance' để thực hiện di chuyển với một cuộc gọi đơn lẻ nhưng độ phức tạp của trước là' O (n) 'cho các danh sách (nơi nó sẽ là' O (1) 'cho một vectơ). –

3

Điều này sẽ làm việc thực sự như vector iterator là truy cập ngẫu nhiên iterator. Đó không chỉ là bạn có thể hành động trên chúng như bạn sẽ làm với con trỏ, nhưng chúng được thực hiện khá nhiều bằng cách sử dụng con trỏ/số học con trỏ.

1

hành vi Vâng, nếu iterator là yếu tố cuối cùng của container sau đó

*(it + 1) 

đã xác định. Bạn nên kiểm tra xem

it + 1 != end 

trước khi hủy kết nối nó.

+1

Vì vậy, một chút như sử dụng con trỏ, bạn phải kiểm tra chính mình rằng nó không đi ra khỏi giới hạn. – Dom

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