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ể).
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. –
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
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