STL:指针关联排序容器:排序谓词模板
STL: pointer associative sorted container: sorting predicate template
我的程序演示了谓词模板,该模板可以用作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
和右值引用,这完全没有意义。
相关文章:
- 二叉排序树无法编译
- std::condition_variable::wait()如何评估给定的谓词
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- C++选择排序算法中的逻辑错误
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 排序谓词没有传递对索引对象的引用?
- 解释标准库排序函数C++的比较谓词的工作原理?
- 在 O(N) 时间内使用布尔谓词函数对向量进行排序
- 在C++中使用排序谓词
- std::将排序谓词映射到按字符串大小排序,但保留不同的字符串
- 使用自定义谓词对类成员进行排序
- 对具有 lambda 谓词的向量进行部分排序
- 保持排序序列,不包含小于谓词
- std::list指针上排序算法的STL谓词
- 错误C2914:排序函数无法识别要使用重载谓词的哪个版本
- STL:指针关联排序容器:排序谓词模板
- 如何命名比较谓词函数排序向量
- 排序不喜欢我的谓词
- 如何在c++中为模板化容器类定义排序谓词