2013-02-11 24 views
5

Tôi thực sự ngạc nhiên khi thấy rằng std::count đã trả về một iterator_traits<InputIterator>::difference_type, lần lượt đề cập đến một long int trên nền tảng của tôi.Tại sao std :: count trả về một số nguyên đã ký?

Tại sao lại như vậy? Một phần tử đếm âm trong một vùng chứa không có ý nghĩa gì cả.

+1

Sự khác biệt sẽ chỉ âm nếu phạm vi không hợp lệ và điều này mang lại hành vi không xác định trong thuật toán. –

+0

Thảo luận này có thể hữu ích: http://stackoverflow.com/questions/7505083/why-does-the-c-standard-algorithm-count-return-a-ptrdiff-t-instead-of-size-t?answertab = active # tab-top – Jordan

+0

@ChristianIvicevic, tôi bối rối. Có phải hành vi không xác định hay không? Tôi có nghĩa là, hoặc ranh giới iterators được kiểm tra và nó trả về một giá trị tiêu cực về lỗi, hoặc nó là hành vi không xác định và sau đó những gì nó trả về là không xác định. – qdii

Trả lời

5

Thực tế là std::ptrdiff_t, phải là một số nguyên đã ký. Nó phải được ký vì nó có thể được sử dụng như là sự khác biệt giữa hai vòng lặp và tất nhiên điều đó có thể là tiêu cực.

+0

+1. Chết tiệt tôi nên đã tạo ra một câu trả lời và không phải là một bình luận ... nhưng yeah, đó là đúng. –

+2

Vì vậy, câu hỏi tiếp theo là, tại sao họ sử dụng 'std :: ptrdiff_t' cho std :: count, và nó được trả lời trong một bài viết khác. vì vậy, cảm ơn. – qdii

+1

@qdii 'std :: iterator_traits :: difference_type' giống với biến lặp' differ_type' mặc định là 'ptrdiff_t' (như đã thấy, ví dụ: [here] (http://en.cppreference.com/w/cpp/ Tại sao khoảng cách được chỉ định là 'ptrdiff_t' là _probably_ bởi vì trình vòng lặp có thể được sử dụng giống như con trỏ, nhưng đặc tả (C++ 11) không thực sự đưa ra lý do là tại sao, nó chỉ định nó có –

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