iter_swap可以专门吗?

时间:2012-09-01 11:53:03

标签: c++ algorithm vector c++11 containers

如果我有一个容器std::vector<T*> items,我可以创建IndirectIterator包裹std::vector<T*>::iterator并允许迭代T而不是T*

我可以将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实例,所以它更快(可能)。

3 个答案:

答案 0 :(得分:2)

据我所知,iter_swap仅用于std::reverse,并未提及任何类型的依赖于参数的查找:它始终使用std::iter_swap。并且由于不允许在std命名空间中重载函数,所以运气不好。

答案 1 :(得分:1)

  

我可以将class Class { var label: UILabel! init() { ... label = UILabel() ... } } 专门用于class Class { var label = UILabel() init() { … } } 制定标准   算法(如iter_swap)通过指针交换项目?

您可以随时进行超载/专业化。不过,您的问题是,您是否可以在}命名空间IndirectIterator 中专门设置std::sort

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

这可能是std::sort中的缺陷。 IMO std::iter_swap应调用不合格的std::sort

  

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

不在GCC(至少),因为标准算法使用合格的std::sort(错误?) 我不认为标准是明确的。

答案 2 :(得分:1)

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