2009-05-05 24 views
22

thể trùng lặp:
C++ Best way to check if an iterator is validLàm cách nào để kiểm tra xem điểm lặp STL có ở bất kỳ điểm nào không?

tôi muốn làm một cái gì đó như thế này:

std::vector<int>::iterator it; 
// /cut/ search for something in vector and point iterator at it. 
if(!it) //check whether found 
    do_something(); 

Nhưng không có nhà điều hành! cho vòng lặp. Làm thế nào tôi có thể kiểm tra cho dù các điểm lặp tại bất cứ điều gì?

+0

Bạn không nên sử dụng iterator mà không có bất kỳ tham chiếu đến container nó lặp đi lặp lại. Xem câu trả lời của James Hopkin. –

+0

làm rõ bóng tối Việc vô hiệu hóa các STL Iterators: http://www.angelikalanger.com/Conferences/Slides/CppInvalidIterators-DevConnections-2002.pdf – lsalamon

Trả lời

46

Bạn không thể. Thành ngữ thông thường là sử dụng trình kết thúc của vùng chứa làm điểm đánh dấu 'không tìm thấy'. Đây là những gì std::find trả về.

std::vector<int>::iterator i = std::find(v.begin(), v.end(), 13); 
if (i != v.end()) 
{ 
    // ... 
} 

Điều duy nhất bạn có thể làm với trình lặp không được gán sẽ gán giá trị cho nó.

+1

Bạn đã đề cập đến trường hợp khi trình vòng lặp được khởi tạo và vẫn hợp lệ. Tuy nhiên, một số thao tác trên một số vùng chứa có thể làm mất hiệu lực các trình vòng lặp. Ví dụ, việc loại bỏ các phần tử từ một vector có thể làm mất hiệu lực các trình vòng lặp (trình vòng lặp trỏ đến phần tử cuối cùng trong vectơ trong trường hợp này). –

+1

@ Cătălin: đó là tất cả sự thật, nhưng ngoài phạm vi của câu hỏi, tôi nghĩ vậy. Cũng giống như ! Toán tử ('không') sẽ chỉ làm việc với các con trỏ hợp lệ hoặc null, ở trên sẽ chỉ làm việc với các trình vòng lặp hợp lệ (bao gồm cả các trình lặp' cuối'). –

+0

Giá trị của Iterator nằm trong phạm vi của các lập trình viên cần phải lo lắng. BẠN là người duy nhất cần đảm bảo rằng bạn không làm điều gì đó khó chịu với các trình vòng lặp của mình. – Spidey

0

Nếu bạn muốn sử dụng iterator trong một vòng lặp, cách an toàn nhất để sử dụng nó là theo cách này:

for (std::vector<int>::iterator it = v.begin(); it != v.end(); ++it) 
{ 
do_smth(); 
} 
+0

Trên thực tế nhiều thuật toán chuẩn trả về trình lặp (ví dụ: find) và phương thức trên container (ví dụ: map :: find) –

+0

Nó an toàn trừ khi vòng lặp 'xóa (nó)' vì sau khi xóa, 'nó' trở thành không hợp lệ và tiếp theo '++ nó 'không hợp lệ. –

+0

Không trả lời câu hỏi – lalitm

2

Mặc dù lặp được coi là hình thức chung của con trỏ, họ không chính xác con trỏ. Tiêu chuẩn xác định Past-the-end trình lặp để chỉ báo lỗi tìm kiếm trong vùng chứa. Do đó, nó không được khuyến khích để kiểm tra các biến lặp cho NULL

Past-the-end giá trị là vô nghĩa và không thể thực hiện được.

if(it != aVector.end()) //past-the-end iterator 
    do_something(); 
-3

Tôi tin rằng điều này nên thường cung cấp cho bạn một thử nghiệm tốt:

if (iterator._Mycont == &MyContainer) 
{ 
Probably a valid iterator! 
} 

Bạn có thể làm xét nghiệm để chắc chắn rằng iterator không bằng cuối cùng ...

iterator != MyContainer.end() 

và:

iterator >= MyContainer.begin() 
+2

Dường như rất phụ thuộc vào trình biên dịch (và phiên bản!). –

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