4

2 つのリストの内容を比較する関数を作成しています。要素の順序は関係ないので、比較する前に並べ替えます。リストは、通常のタイプlist<int>にすることも、リストのリストにすることもできますlist<list<int> >

完全に簡略化された例を次に示します。

#include <list>

template <typename T>
bool lessThanInAnyOrder(T lhs, T rhs)
{
  return lhs < rhs;
}

template <typename T>
bool lessThanInAnyOrder(std::list<T> lhs, std::list<T> rhs)
{
  lhs.sort(lessThanInAnyOrder<T>);
  rhs.sort(lessThanInAnyOrder<T>);

  //Do comparisons here, but for now just:
  return false;
}

int main()
{
  std::list<int> list1;
  std::list<int> list2;
  lessThanInAnyOrder(list1, list2);
}

これは GCC 4.3.3 でコンパイルされますが、Visual Studio 2008 では、呼び出している場所で次のコンパイル エラーが発生しますlhs.sort()

error C2660: 'std::list<_Ty>::sort' : function does not take 1 arguments

助言がありますか?

4

4 に答える 4

3

コンパイラがオーバーロードされた 'lessThanInAnyOrder' 関数を選択して list::sort に渡すことができないため、コンパイルが失敗します。hereのようにタイプを明示的に指定する必要があります。

template <typename T>
bool lessThanInAnyOrder(std::list<T> lhs, std::list<T> rhs)
{
  bool (*comparer)(T, T) = &lessThanInAnyOrder<T>;
  lhs.sort(comparer);
  rhs.sort(comparer);
 
  //Do comparisons here, but for now just:
  return false;
}
于 2011-06-30T09:02:08.173 に答える
3

最初に: 順序に関係なくコレクションを比較したい場合は、 、 、およびアルゴリズムを探してstd::setいるset_differenceset_intersection思いset_unionますset_symmetric_difference

あなたの質問に

ポリシーによるソートを実装しようとしています。単純に特化できない場合std::less<>(まさにその目的のために存在します)、カスタム ポリシーを自分で作成できます: ( codepad.orgで実行されているコード)

#include <list>
#include <vector>
#include <iostream>
#include <iterator>
#include <algorithm>

namespace applogic
{
    template <typename T>
    struct sort_policy
    {
        typedef std::less<T> predicate_t;
    };

    template <> struct sort_policy<std::string>
    {
        struct _Cmp { bool operator()(const std::string& a, const std::string& b) { return a.length()>b.length(); } };
        typedef _Cmp predicate_t;
    };

    template <typename C>
        void sort(C& cont)
    {
        typedef typename sort_policy<typename C::value_type>::predicate_t P;
        std::sort(cont.begin(), cont.end(), P());
    }

    template <typename T>
        void sort(std::list<T>& cont)
    {
        typedef typename sort_policy<T>::predicate_t P;
        cont.sort(P());
    }
}

template <class C>
    static void dump(const C& cont, const std::string& msg="")
{
    std::cout << msg;
    std::copy(cont.begin(), cont.end(), std::ostream_iterator<typename C::value_type>(std::cout, ", "));
    std::cout << std::endl;
}

int main()
{
    using applogic::sort;

    std::vector<int> ints;
    ints.push_back(13);
    ints.push_back(-3);
    ints.push_back(7);

    dump(ints, "before: ");
    sort(ints);
    dump(ints, "after: ");

    std::list<std::string> strings;
    strings.push_back("very very long");
    strings.push_back("tiny");
    strings.push_back("medium size");

    dump(strings, "before: ");
    sort(strings);
    dump(strings, "after: ");

    return 0;
}
于 2011-06-30T09:17:17.193 に答える
2

std::ptr_fun関数を明示的な型引数でラップします。

lhs.sort(std::ptr_fun<T, T>(lessThanInAnyOrder<T>));
于 2011-06-30T08:47:02.130 に答える
0

私の推測では、intタイプについては、次のように簡単に書くことができます。

lhs.sort();
rhs.sort();

デモ。

于 2011-06-30T08:40:17.157 に答える