2015-03-10 18 views
6

Chỉ cần nhận ra rằng std::count_ifreturns a signed value.Tại sao std :: count_if trả về giá trị đã ký thay vì chưa ký?

Tại sao thiết bị được thiết kế theo cách này? Cả hai đều không có ý nghĩa (kết quả chỉ có thể là số tự nhiên, tức là số nguyên âm) theo ý kiến ​​của tôi, vì nó không cho phép thực hiện điều gì đơn giản như so sánh kết quả này với số size() của vùng chứa mà không nhận cảnh báo hoặc sử dụng chuyển đổi loại rõ ràng.

Tôi thực sự nghĩ rằng loại trả về phải có size_type.

Tôi có thiếu gì đó không?

+0

Một số ý nghĩa để trả về 'differ_type' của trình lặp cho' count', vì nó chỉ là sự khác biệt của các đối số, nên giữ giao diện đó cho 'count_if', và nó làm cho ý nghĩa cho 'differ_type' được ký cho các trình vòng lặp hai chiều. – BoBTFish

+0

Tương tự như vậy tại sao không thể tách hai 'std :: list's trong một thời gian không đổi? –

+1

@WojciechFrohmberg: Đơn giản, bạn cần đếm các yếu tố. Danh sách sau khi tạo ra có O (1) '.ize()' ngụ ý nó được lưu trữ, – MSalters

Trả lời

2

Tôi nghĩ kiểu trả về nhằm tương thích với std::count, có hai trình vòng lặp (nghĩ về con trỏ) và trả về các giá trị ở giữa (bạn có thể nghĩ đó là sự khác biệt của hai con trỏ). Sự khác biệt con trỏ (như được sử dụng trong ptrdiff_t) phải là một giá trị đã ký.

Nhờ khả năng tương thích với std::count bạn có thể dễ dàng so sánh kết quả của hai hàm này.

Chỉnh sửa: Không có giới hạn liên quan đến phạm vi sử dụng giá trị đã ký tại đây, vì giá trị ít nhất nằm trong phạm vi [0, std::count] chính nó sẽ nằm trong khoảng [0, end_ptr - start_ptr]. Vì end_ptr - start_ptr được nhập là ptrdiff_t hoặc tương tự, nó đã được ký.

+3

Vô nghĩa. Mô tả 'std :: count' nói rõ:" Trả về ** số phần tử ** trong phạm vi [đầu tiên, cuối cùng) so sánh bằng với val. " Số phần tử không được âm. Loại đối số 'count' (vòng lặp) là hoàn toàn không liên quan. –

+0

@VioletGiraffe: Có. Số phần tử không được âm. Nhưng chữ ký của 'count' và' count_if' đều chứa các trình lặp. Tôi đã không nói nó có ý nghĩa nhiều để xác định một số yếu tố đã ký ... – urzeit

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