Có tùy chọn thứ tư (không nhất thiết phải là một tùy chọn tốt, nhưng nó tồn tại).Bạn có thể sử dụng lặp hai chiều/truy cập ngẫu nhiên theo kiểu bắt chước cách lặp ngược lại được thực hiện để tránh những vấn đề với myvec.end()-1
trên một iterator trống:
for (vector<int>::iterator it = myvec.end(); it != myvec.begin(); --it)
{
// convert the loop controlling iterator to something that points
// to the item we're really referring to
vector<int>::iterator true_it = it;
--true_it;
// do stuff here
// but always dereference `true_it` instead of `it`
// this is essentially similar to the way a reverse_iterator
// generally works
int& x = *true_it;
}
hoặc thậm chí:
for (vector<int>::iterator it = myvec.end(); it != myvec.begin();)
{
// decrement `it` before the loop executes rather than after
// it's a bit non-idiomatic, but works
--it;
int& x = *it;
// do stuff...
}
Như tôi đã nói, điều này không nhất thiết là một lựa chọn tốt (tôi nghĩ rằng Jerry Coffin's answer là cách tiếp cận bạn nên xem trước), nhưng tôi nghĩ nó quan tâm vì nó cho thấy các trình vòng lặp ngược hoạt động như thế nào - và tránh được việc chuyển đổi một reverse_iterator thành một trình lặp những lúc bạn có thể muốn sử dụng trình lặp với thứ gì đó sẽ không chấp nhận một số reverse_iterator
(chuyển đổi reverse_iterator
s thành iterator
s luôn làm tôi đau đầu, vì vậy tôi sẽ thường xuyên tránh reverse_iterators
để tránh bị đau đầu). Ví dụ: nếu bạn muốn gọi insert() cho vị trí mà trình lặp ngược lại đề cập đến:
// if `it` is a reverse iterator, a call to insert might have to look something like:
myvec.insert(--(it.base()), 42); // assume that you know the current vector capacity
// will avoid a reallocation, so the loop's
// iterators won't be invalidated
// if `it` is a normal iterator...
myvec.insert(it, 42);
Nguồn
2010-03-30 22:38:32
"Nó cũng sử dụng> =, sẽ không hoạt động đối với trình lặp không truy cập ngẫu nhiên". OK, không phải 'end() -1' ;-) –
+1. Khi một thư viện cung cấp chức năng được thiết kế rõ ràng để thực hiện một tác vụ, bạn thường nên sử dụng nó khi cố gắng thực hiện cùng một nhiệm vụ. – Brian
@Steve: Heh, đúng vậy. Tôi đã suy nghĩ 'end() -' hoạt động cho các trình vòng lặp hai chiều. – GManNickG