1

これが私のコードの簡略版です:

template<typename TIterator>
TIterator findMaximalPosition(TIterator begin, TIterator end)
{
    TIterator result(begin);
    for (TIterator it = begin + 1; it != end; ++it)
    {
        if ((*it)->value > (*result)->value) // Here I just need to change to "<"
            result = it;                     // to get a findMinimalPosition
    }
    return result;
}

template<typename TIterator>
TIterator findMinimalPosition(TIterator begin, TIterator end)
{
    // almost the same
}

これは単純化された例です。<私のコードは、または>記号、または使用するかどうか++を除いて、2つの関数が同じである場所でいっぱいです--

私の質問は:

コードのこの重複を減らす方法はありますか?

  1. 読みやすさを破壊する
  2. パフォーマンスを低下させますか?

テンプレートパラメータとして演算子(<または)へのポインタを使用することを考えていました。>ポインタはコンパイル時定数になるため、これによってパフォーマンスが低下することはありません。より良いまたは一般的に使用される方法はありますか?

編集:

だから私が答えに基づいてしたことは、実装することでした:

template <typename TIterator, typename TComparison>
TIterator findExtremalPosition(TIterator begin, TIterator end, 
                               TComparison comparison);

次に、次のように呼び出します。

return findExtremalPosition(begin, end, std::less<double>());

return findExtremalPosition(begin, end, std::greater<double>());

これがあなたの意図したことだといいのですが。苦労した後、オペレーターのために同様の解決策を実行できると思い++ます--

4

2 に答える 2

5

述語を取り、使用する一般的な関数を作成し、指定された型がそれぞれ実装するためにその関数の引数として使用std::greaterします。std::lessfindMaximalPositionfindMinimalPosition

于 2013-03-12T15:16:02.723 に答える
1

Ivaylo Strandjevが示唆しているように、考えられる解決策の1つは、述語を使用することです。

したがって、述語を処理するように関数を変更すると...

typename std::vector<int> vec;

template<typename TIterator, bool (*Predicate)(const TIterator &, const TIterator &)>
TIterator findPosition(TIterator begin, TIterator end)
{
    TIterator result(begin);
    for (TIterator it = begin + 1; it != end; ++it)
    {
        if (Predicate(it, result))
            result = it;
    }
    return result;
}

...次に、目標を達成するのに役立ついくつかの述語を定義します...

bool lesser(const vec::iterator &a, const vec::iterator &b)
{
    return (*a) < (*b);
}

bool greater(const vec::iterator &a, const vec::iterator &b)
{
    return (*a) > (*b);
}

...その後、これを行うことができます:

vec::iterator min = findPosition<typename vec::iterator, lesser>(v.begin(), v.end());
vec::iterator max = findPosition<typename vec::iterator, greater>(v.begin(), v.end());

利点は、要素が他の要素よりも大きいか小さいかをチェックする関数だけでなく、便利だと思われる関数を提供することです。

bool weird(const vec::iterator &a, const vec::iterator &b)
{
    return ((*a) | (*b)) & 0x4;
}

vec::iterator weird = findPosition<typename vec::iterator, weird>(v.begin(), v.end());

ここの例。

ただし、この作業を行う前に、Algorithmsライブラリがすでにその役割を果たしているかどうかを確認してください。

かなりすっきりとシンプルに見えると思います。

それが役に立てば幸い。

于 2013-03-12T15:38:39.667 に答える