Tiêu đề <algorithm>
cung cấp std::equal_range()
, cũng như một số vùng chứa có chức năng thành viên. Điều làm phiền tôi với hàm này là nó trả về một cặp các trình vòng lặp, làm cho nó tẻ nhạt để lặp lại từ trình vòng lặp bắt đầu đến trình vòng lặp kết thúc. Tôi muốn có thể sử dụng std::begin()
và std::end()
để tôi có thể sử dụng vòng lặp C++ 11 cho vòng lặp.Tôi có thể chuyên std :: bắt đầu và std :: kết thúc cho giá trị trả về của equal_range()?
Bây giờ, tôi đã nghe thông tin mâu thuẫn liên quan đến chuyên std::begin()
và std::end()
- Tôi được thông báo rằng việc thêm bất kỳ thứ gì vào không gian tên std dẫn đến hành vi không xác định, trong khi tôi cũng được thông báo rằng bạn có thể cung cấp chuyên môn của riêng mình của std::begin()
và std::end()
.
Đây là những gì tôi đang làm ngay bây giờ:
namespace std
{
template<typename Iter, typename = typename iterator_traits<Iter>::iterator_category>
Iter begin(pair<Iter, Iter> const &p)
{
return p.first;
}
template<typename Iter, typename = typename iterator_traits<Iter>::iterator_category>
Iter end(pair<Iter, Iter> const &p)
{
return p.second;
}
}
Và điều này không làm việc: http://ideone.com/wHVfkh
Nhưng tôi tự hỏi, những nhược điểm để làm điều này là gì? Có cách nào tốt hơn để làm điều này?
Chính xác như thế nào là 'một phần' là được cho phép nếu các loại do người dùng xác định có liên quan? Cặp chứa các trình vòng lặp lặp qua một vùng chứa unique_ptrs đến kiểu do người dùng định nghĩa của tôi. –
Định nghĩa của bạn, như được viết, không đề cập đến bất kỳ loại do người dùng xác định nào. Các mẫu này cuối cùng có thể được khởi tạo với các loại do người dùng xác định, nhưng điều đó không liên quan. –
Trong mọi trường hợp, lối thoát "phụ thuộc vào loại do người dùng xác định" chỉ áp dụng cho các chuyên môn mẫu. Bản thân bạn không phải là: chúng là các mẫu chức năng chính, chỉ xảy ra khi quá tải các mẫu chức năng khác có cùng tên. –