学习笔记——c++自定义class用于unordered
来源:互联网 发布:数据库服务器 编辑:程序博客网 时间:2024/05/23 10:26
unordered
unordered_set和unordered_map基本接口与set和map类似,区别在于其内部构造并不是红黑树而是散列表,通常来说散列表的效率更高。
需要注意的是unordered可以应用于内置类型,但用户自定义的class必须定义operator==和hash函数才能装入容器。
有如下class
class A{private: size_t _x;public: friend bool operator==(const A& lh, const A& rh) { return (lh.getX() == rh.getX()); }; A(size_t x = 0) :_x(x) { std::cout << "A::A()" << std::endl; }; int getX() const{return _x;}; };
(1) 使用普通函数,利用function
size_t hash_value(const A &a){ return std::hash<int>()(a.getX());}int main(){ unordered_set<A, function<size_t(const A &a)> > s(1, hash_value); //function写起来比较麻烦,也可以直接用decltype推导类型 unordered_set<A, decltype(&hash_value)> s(1, hash_value); A a(0); s.insert(a); return 0;}
这种实现方便简单,但是必须用带参数的unordered_set constructor
(2)使用lambda
int main(){ unordered_set<A, function<size_t(const A &a)>> s(1, [](const A &a) { return std::hash<int>()(a.getX()); } ); A a(0); s.insert(a); return 0;}lambda可以直接在constructor中定义匿名函数,但这种写法比较不易读,而且不能使用decltype,必须由程序员指定类型。
(3) 使用function object
struct hash_value{ size_t operator()(const A &a) const { return std::hash<int>()(a.getX()); }};int main(){ unordered_set<A, hash_value> s; A a(0); s.insert(a); return 0;}
(4) Specializing std::hash
如果我们需要定义一个class供其他人使用,为了能够应用于unordered容器必须拥有一个hash函数,而让客户定义hash函数是不合适的。对于这种问题,一个较好的解决方法是模板特化
namespace std{ template<> class hash<A> { public: size_t operator()(const A &a) const { return std::hash<int>()(a.getX()); } };};int main(){ unordered_set<A> s A a(0); s.insert(a); return 0;}这种方法可以使自定义的class像内置类型一样使用,但需要注意如果特化的模板可能会污染匿名空间,对其他不相关的class造成意料之外的影响。
参考资料:
http://marknelson.us/2011/09/03/hash-functions-for-c-unordered-containers/
《Boost程序库完全开发指南》 P267
0 0
- 学习笔记——c++自定义class用于unordered
- STL学习笔记— —无序容器(Unordered Container)
- STL学习笔记9— —无序容器(Unordered Container)
- unordered学习(c++11)
- unordered
- CF 27C Unordered Subsequence
- python sets — Unordered collections of unique elements
- c#学习笔记——class
- C#/WPF学习笔记:class 与 struct
- Object-C学习笔记(二)---类class
- C题:CodeForces 27C Unordered Subsequence
- Objective-C学习笔记(二十二)——初始化方法init的重写与自定义
- c++primer学习笔记-----2.6自定义数据结构
- 【笔记-C++】 class
- 如何学习C#——For My Class
- c#学习笔记——class(续1)
- 《笨办法学 Python》 学习笔记05 —— Class
- python 学习笔记——set() class 集合类型
- Python爬虫实践(七):正则表达式(2) re模块的使用
- Use adb over Wi-Fi
- docker 创建本地镜像服务器
- 解决 flume KafkaSink 启动后cpu占用100%的问题
- 在android studio中将某个module生成jar包,觉得还是直接用aar好
- 学习笔记——c++自定义class用于unordered
- SpringMVC-----Json视图返回@Entity对象报错
- 计算机的高级语言
- protobuf传输文件
- 由 12306.cn 谈谈高并发+高负载网站性能技术
- Swift - 加速传感器(CoreMotion)的用法,小球加速运动并反弹样例
- windows下安装rabbitmq的php扩展amqp
- bootstrapTable跨域问题
- 使用RecyclerView实现滑动添加、滑动删除,以及瀑布流、ListView、GridView的转换