2012-09-01 24 views
5

Nếu tôi có một vùng chứa std::vector<T*> items, tôi có thể tạo một IndirectIterator kết thúc tốt đẹp std::vector<T*>::iterator và cho phép lặp lại trên T 's thay vì T*.Có thể iter_swap chuyên biệt không?

Tôi có thể chuyên iter_swap cho IndirectIterator để tạo các thuật toán chuẩn (chẳng hạn như std::sort) hoán đổi các mục bằng con trỏ không?

tức là, nếu tôi viết như sau, liệu nó có ảnh hưởng gì đến thuật toán chuẩn không?

namespace some_namespace 
{ 
    template <typename IterT> 
    class IndirectIterator 
    { 
      IterT m_base; 
     public: 
      typedef IterT base_iterator; 
      typedef /* ... */ reference; 

      /* ... */ 

      reference operator*() const { **m_base; } 

      const base_iterator& base() const { return m_base; } 
      base_iterator& base() { return m_base; } 
    }; 

    template <typename T> 
    void iter_swap(IndirectIterator<T>& a, IndirectIterator<T>& b) 
    { 
     using std::iter_swap; 
     iter_swap(a.base(), b.base()); 
    } 
} 

Lợi ích của chuyên môn này là nó hoán đổi con trỏ chứ không phải là toàn bộ T, vì vậy nhanh hơn (có thể).

Trả lời

2

Theo như tôi thấy, iter_swap chỉ được sử dụng trong std::reverse và không đề cập đến bất kỳ loại tra cứu phụ thuộc đối số nào: nó luôn sử dụng std::iter_swap. Và vì bạn không được phép quá tải các chức năng trong không gian tên std, bạn sẽ không may mắn.

+0

Kiểm tra một số tiêu đề từ libC++ điều này có vẻ chính xác, mặc dù có một chút thất vọng. Tôi đoán tôi có thể làm điều đó với một lớp tham chiếu tùy chỉnh, nhưng tôi không chắc chắn nó có giá trị nó chỉ để làm cho trao đổi đẹp hơn. –

+0

Trong C++ 11 (ít nhất), 'std :: sort' sử dụng' std :: iter_swap'. (và tôi đã phải chuyên/xác định 'std :: iter_swap' để làm cho một công việc lặp đặc biệt nhất định với' std :: sort'. – alfC

+1

Bạn vẫn được phép chuyên mẫu trong không gian tên 'std' miễn là chúng được chuyên biệt hóa cho các đối số do người dùng xác định. – AnT

1

Tôi có thể chuyên iter_swap cho IndirectIterator để làm thuật toán tiêu chuẩn (như std::sort) mục hoán đổi bởi con trỏ?

Bạn luôn có thể thực hiện quá tải/chuyên môn hóa của mình. Tuy nhiên, câu hỏi của bạn là liệu bạn có thể chuyên iter_swapbên trong không gian tên std.

Tôi nghĩ câu trả lời không rõ ràng từ tiêu chuẩn. Tôi thấy rằng trong một số trường hợp, tôi phải xác định một số iter_swap đặc biệt bên trong std để std::sort sử dụng nó. Trong gcc std lib std::sort, hãy sử dụng std::iter_swap đủ điều kiện.

Đây có thể là lỗi trong std::sort. IMO std::sort nên gọi số swap_iter không đủ điều kiện.

tức là, nếu tôi viết như sau, liệu nó có ảnh hưởng đến thuật toán chuẩn không?

Không có trong GCC (ít nhất) vì thuật toán tiêu chuẩn sử dụng có trình độ std::iter_swap (bug?) Tôi không nghĩ rằng tiêu chuẩn rõ ràng về nó.

0

Bạn được phép mở lại không gian tên std và chuyên mẫu bên trong std miễn là bạn chuyên cung cấp chúng cho các loại do người dùng xác định. Trong trường hợp của bạn, bạn có thể thực sự chuyên std::iter_swap cho mục đích của bạn, chỉ cần chắc chắn rằng bạn đang làm điều đó trong không gian tên std, không phải trong không gian tên của riêng bạn (như trong ví dụ của bạn). Nó không phải là rất thanh lịch, nhưng nó được cho phép.

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