9

如果我有一个 container std::vector<T*> items,我可以创建一个IndirectIteratorwhich 包装std::vector<T*>::iterator并允许迭代T's 而不是T*'s。

我可以专门iter_swap制作IndirectIterator标准算法(例如std::sort)通过指针交换项目吗?

即,如果我写以下内容,它会对标准算法产生影响吗?

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());
    }
}

这种专业化的好处是它交换指针而不是完整的 T 实例,因此它更快(可能)。

4

3 回答 3

2

据我所知,iter_swap仅在 中使用std::reverse,并且没有提及任何类型的参数相关查找:它始终使用std::iter_swap. 而且由于不允许您在std命名空间中重载函数,因此您很不走运。

于 2012-09-01T11:57:35.827 回答
1

我可以专门iter_swap制作IndirectIterator标准算法(例如std::sort)通过指针交换项目吗?

你总是可以让你的超载/专业化。但是,您的问题是您是否可以在 namespaceiter_swap std进行专业化。

我认为标准中的答案尚不清楚。我发现在某些情况下,我必须定义一个特殊的iter_swap内部std以便std::sort使用它。在 gcc 标准库std::sort中使用合格的std::iter_swap.

这可能是std::sort. IMOstd::sort应称为不合格的swap_iter.

即,如果我写以下内容,它会对标准算法产生影响吗?

不是在 GCC 中(至少),因为标准算法使用合格std::iter_swap的(错误?)我认为标准并不清楚。

于 2016-11-07T07:43:49.760 回答
1

只要您为用户定义的类型专门化它们,您就可以重新打开std命名空间并专门化其中的模板。std在您的情况下,您实际上可以专门std::iter_swap针对您的目的,只需确保您在std命名空间中进行,而不是在您自己的命名空间中(如您的示例中所示)。这不是很优雅,但它是允许的。

于 2016-11-07T07:52:09.227 回答