STL:指针关联排序容器:排序谓词模板

STL: pointer associative sorted container: sorting predicate template

本文关键字:排序 谓词 关联 STL 指针      更新时间:2023-10-16

我的程序演示了谓词模板,该模板可以用作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谓词?

为什么要使用模板模板,而不仅仅是在通用二进制比较器周围添加一个简单的包装器?

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

Boost指针容器也可以让这变得容易得多。

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和右值引用,这完全没有意义。