2

テンプレートをいじっていますが、テンプレートを使用すると一致しない関数エラーが発生するのはなぜだろうと思っていました。

/*selection sort*/
template <typename InputIterator, typename T>
void selection_sort(InputIterator first, InputIterator last){
    InputIterator min;
    for(; first != last - 1; ++first){
        min = first;

        for(T i = (first + 1); i != last ; ++i)
        {
            if(*first < *min)
                min = i;
        }
        myswap(*first, *min);
    }
}

int main(){
    int a[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
    vector<int> v(a, a+10);
    selection_sort(v.begin(),v.end());
}
4

2 に答える 2

7

推定されていないテンプレート パラメーター T があるため、1)typename Tを最初のテンプレート パラメーターとして移動する必要があります。

// now InputIterator will be deduced
template <typename T, typename InputIterator>
void selection_sort(InputIterator first, InputIterator last)
{
    // your implementation
}

および2)並べ替えの呼び出しを修飾するselection_sort<int>(v.begin(), v.end());

ところで、これは選択ソートのもう少し一般的な実装です。テンプレートパラメーターとしてイテレーターと比較関数のみを使用し、比較関数はイテレーターが指す値の型を取ることに注意してください (これはデフォルトのため C++11 コードです)関数テンプレート パラメーター。C++98 コンパイラの場合、比較関数の有無にかかわらず、2 つのオーバーロードが必要です)

template< typename ForwardIterator, typename Compare = std::less<typename std::iterator_traits<ForwardIterator>::value_type> >
void selection_sort(ForwardIterator first, ForwardIterator last, Compare cmp = Compare())
{
        for (auto it = first; it != last; ++it) {
                auto const selection = std::min_element(it, last, cmp);
                std::iter_swap(selection, it);
        }
}

への呼び出しstd::min_elementは for ループに相当し、iter_swapは独自のスワップに相当します。STL アルゴリズムを使用する利点は、アルゴリズムが正しい可能性がはるかに高いことです (手書きコードの off-by-one エラーは非常に一般的です)。

std::upper_boundPS: 同様に、 andを使用して、insertion_sort アルゴリズムを 2 行で記述できますstd::rotate(リーダーの演習)。

于 2013-01-19T09:18:33.433 に答える
3

問題は、typename T使用されていないように見え、コンパイラによって推測できないことです。タイプを明示的に指定する必要があります。

selection_sort<vector<int>::iterator, int>(v.begin(),v.end());
于 2013-01-19T09:17:52.247 に答える