9

コンテナがある場合は、ラップして'sではなく'sを反復処理できるstd::vector<T*> itemsanを作成できます。IndirectIteratorstd::vector<T*>::iteratorTT*

標準のアルゴリズム(など)をポインタでスワップiter_swapすることに特化できますか?IndirectIteratorstd::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することに特化できますか?IndirectIteratorstd::sort

あなたはいつでもあなたの過負荷/専門化をすることができます。ただし、あなたの質問は、名前空間iter_swap stdで専門化できるかどうかです。

基準からは答えが不明確だと思います。場合によっては、それを使用するために特別なiter_swap内部を定義する必要があることがわかりました。gccでは、stdlibは修飾されたを使用します。stdstd::sortstd::sortstd::iter_swap

これはおそらくの欠陥ですstd::sort。IMOstd::sortは非修飾を呼び出す必要がありますswap_iter

つまり、次のように書くと、標準のアルゴリズムに影響がありますか?

標準のアルゴリズムは修飾された(バグ?)を使用しているため、(少なくとも)GCCstd::iter_swapにはありません。標準がそれについて明確であるとは思いません。

于 2016-11-07T07:43:49.760 に答える
1

ユーザー定義型に特化している限り、std名前空間を再度開いて、テンプレートを内部に特化することができます。stdあなたの場合、あなたは実際std::iter_swapにあなたの目的に特化することができます、あなたがstdあなた自身の名前空間ではなく、名前空間でそれをしていることを確認してください(あなたの例のように)。あまりエレガントではありませんが、許可されています。

于 2016-11-07T07:52:09.227 に答える