2011-08-04 36 views
27

Giả sử tôi có mộtlàm thế nào để có được iterator đến một vị trí đặc biệt của một vector

std::vector<int> v 
//and ... 
for(int i =0;i<100;++i) 
v.push_back(i); 

bây giờ tôi muốn một iterator để, chúng ta hãy nói nguyên tố thứ 10 của vector.

mà không làm phương pháp sau đây

std::vector<int>::iterator vi; 
vi = v.begin(); 
for(int i = 0;i<10;i++) 
    ++vi; 

vì điều này sẽ làm hỏng các lợi thế của việc có iterator truy cập ngẫu nhiên cho một vector.

+0

Bản sao có thể có của [C++ STL Vectors: Nhận trình lặp từ chỉ mục?] (Http://stackoverflow.com/questions/671423/c-stl-vectors-get-iterator-from-index) –

Trả lời

35

Chỉ cần thêm 10 vào trình lặp. Chúng được thiết kế để "cảm thấy" như con trỏ.

+0

cảm ơn .. đó là hữu ích –

+1

Bạn không muốn thêm 9? Thêm 0 di chuyển đến phần tử thứ nhất, Thêm 1 di chuyển vào phần tử thứ 2, ... Thêm di chuyển n-1 vào phần tử thứ n. – Shillard

+0

Đó là bóng bẩy. :-) –

46

này sẽ làm việc với bất kỳ iterator truy cập ngẫu nhiên, chẳng hạn như một từ vector hoặc deque:

std::vector<int>::iterator iter = v.begin() + 10; 

Nếu bạn muốn có một giải pháp mà sẽ làm việc cho bất kỳ loại iterator, sử dụng next:

std::vector<int>::iterator iter = std::next(v.begin(), 10); 

Hoặc nếu bạn không thực hiện trên C++ 11, advance:

std::vector<int>::iterator iter = v.begin(); 
std::advance(iter, 10); 
+0

cảm ơn ... Nghi thức bây giờ chỉ cần thêm 10 tác phẩm cho tôi. Nhưng tôi sẽ lưu ý về tiền tạm ứng. –

+1

Tôi muốn std :: advance() vì nó hoạt động với bất kỳ trình lặp nào; theo cách đó bạn không bị ràng buộc vào một thùng chứa cụ thể. –

+0

@Matt: Trong mọi khả năng, nếu thuật toán của bạn yêu cầu truy cập phần tử thứ n, nó sẽ vô ích một cách vô ích với bất kỳ thứ gì khác ngoài trình lặp truy cập ngẫu nhiên; vì vậy nó sẽ thực sự tốt hơn để sử dụng 'operator +' thay vì 'std :: advance' và nhận được một lỗi trình biên dịch với kiểu trình lặp sai. – ildjarn

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