最初に: 順序に関係なくコレクションを比較したい場合は、 、 、およびアルゴリズムを探してstd::set
いるset_difference
とset_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;
}