STL: указатель ассоциативно отсортированный контейнер: шаблон предиката сортировки - PullRequest
0 голосов
/ 10 января 2012

Моя программа иллюстрирует шаблон предиката, который можно использовать в качестве предиката сортировки для создания экземпляров контейнеров STL:

#include <iostream>
#include <set>
#include <iterator>
#include <algorithm>
#include <functional>
#include <string>

using namespace std;

template<typename T, template <typename> class comp = std::less> struct ComparePtr: public binary_function<T const *, T const *, bool> {
  bool operator()(T const *lhs, T const *rhs) const {
    comp<T> cmp;
    return (cmp(*lhs, *rhs));
  }
};

int wmain() {
  string sa[] = {"Programmer", "Tester", "Manager", "Customer"};
  set<string *, ComparePtr<string>> ssp;
  for (int i(0) ; i < sizeof sa/sizeof sa[0] ; ++i)
    ssp.insert(sa + i);

  for_each(ssp.begin(), ssp.end(), [](string *s){ cout << s->c_str() << endl; });

  return 0;
}

Пожалуйста, обратите внимание на предикат: правильно ли он написан?Это хорошо, чтобы создать экземпляр comp?Есть ли способ, позволяющий не создавать экземпляр comp предиката?

1 Ответ

3 голосов
/ 10 января 2012

Зачем вообще использовать шаблон шаблона, а не просто добавлять простую обертку вокруг общих двоичных компараторов?

template<typename P>
struct PointerPred {
  P p;
  template<typename T>
  bool operator()(const T& x, const T& y) { return p(*x, *y); }
};

Контейнеры повышения указателя также могут сделать это намного проще.

Ildjarn показал, как правильно реализовать ваш функтор:

template<template<typename> class comp = std::less>
struct ComparePtr {
  template<typename T>
  bool operator()(T const *lhs, T const *rhs) const {
    return comp<T>()(*lhs, *rhs);
  }
};

Таким образом, больше не нужно указывать тип аргументов.

Редактировать: раньше былоstd::forward и rvalue ссылки в моем коде, что не имело никакого смысла.

...