2009-07-27 22 views
11

Chuẩn C++ có nói rằng tôi có thể so sánh hai trình lặp STL mặc định được xây dựng mặc định cho bình đẳng không? Các trình vòng lặp được xây dựng mặc định có được so sánh bằng nhau không?So sánh các biến lặp được xây dựng mặc định với toán tử ==

Tôi muốn những điều sau đây, sử dụng std :: danh sách ví dụ:

void foo(const std::list<int>::iterator iter) { 
    if (iter == std::list<int>::iterator()) { 
     // Something 
    } 
} 

std::list<int>::iterator i; 
foo(i); 

Những gì tôi muốn ở đây là một cái gì đó giống như một giá trị NULL cho vòng lặp, nhưng tôi không chắc chắn nếu đó là hợp pháp. Trong việc thực hiện STL đi kèm với Visual Studio 2008, chúng bao gồm các xác nhận trong std :: toán tử danh sách ==() loại trừ việc sử dụng này. (Họ kiểm tra rằng mỗi iterator là "sở hữu" bởi cùng một container và iterators xây dựng mặc định không có container.) Điều này sẽ gợi ý rằng nó không hợp pháp, hoặc có lẽ rằng họ đang quá hăng hái.

+0

'boost :: tùy chọn ' đến với tâm trí. – MSalters

Trả lời

15

OK, tôi sẽ bị đâm. Tiêu chuẩn C++, Mục 24.1/5:

Các bộ lặp cũng có thể có số ít nhất là giá trị không được liên kết với bất kỳ thùng chứa nào. [Ví dụ: Sau khi khai báo của con trỏ uninitialized x (như với int * x;), x phải luôn được giả định có giá trị số ít là của con trỏ. ] Kết quả của hầu hết các biểu thức không được xác định cho số ít giá trị; ngoại lệ duy nhất là việc gán giá trị không phải là số ít cho một trình lặp có giá trị số ít là .

Vì vậy, không, chúng không thể so sánh được.

+0

Tốt, bạn đã hiểu nó :) – AraK

+0

Điều gì về 'std :: istream_iterator. Đó chính xác là cách bạn so sánh bài kiểm tra để kết thúc. –

1

Tôi tin rằng bạn nên vượt qua một dải cho hàm.

void fun(std::list<int>::iterator beg, std::list<int>::iterator end) 
{ 
    while(beg != end) 
    { 
     // do what you want here. 
     beg++; 
    } 
} 
+1

Có thể đúng, nhưng không trả lời câu hỏi. –

+0

Yup, chỉ 2 xu của tôi :) – AraK

+1

Tôi hiểu những gì bạn đang nói, nhưng ngữ nghĩa thực sự gọi cho một mục duy nhất - giống như std :: list :: erase(). Tôi có thể lạm dụng khái niệm về một trình lặp; đó là điều tôi muốn khám phá. – Adrian

1

Đặc điểm kỹ thuật nói rằng điều kiện của hàm khởi tạo mặc định là trình lặp đó là singular. Việc so sánh bình đẳng là không xác định, do đó, nó có thể khác trong một số triển khai.

6

Điều này sẽ thay đổi trong C++ 14. [forward.iterators] 24.2.5p2 của N3936 nói

Tuy nhiên, trình vòng lặp khởi tạo giá trị có thể được so sánh và so sánh với các biến lặp khởi tạo giá trị khác cùng loại.

+0

Tôi đã đạt được điều này ngay bây giờ khi triển khai một cái gì đó tại nơi làm việc: (Tôi đã ước mình có C++ 2014 nhưng chỉ có studio hình ảnh 2012: D –

+0

Đây không phải là ý tưởng hay ngay cả trong C++ 14. Không được so sánh với một trình lặp lặp khởi tạo giá trị. –

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