条目二十《为包含指针的关联容器指定比较类型》
stl中的关联容器是一种动态数据结构,其数据存储方式是以内存节点方式的数据结构,具体来说一般是一种平衡二叉树(红黑树),在向关联容器插入元素的时候,容器内部为了保持树的平衡性,会自动(插入函数有自我调整代码)的调整当前插入元素的存储位置,达到动态平衡的目的。
所以在关联容器存储的是指针的时候,如果是采用默认的比较对象,那么由于是指针,那么整个容器的元素肯定是按照插入元素的指针来排列,然而由于是节点存储方式,分配的每个节点的地址的数值大小是定的,所以会造成容器内部的元素排序方式是不能控制。
这种情况下对容器的操作,比如set容器,是按照键值来排序的(对于非指针元素),但如果是存储指针类型,对set的操作,比如打印,会发现元素的打印结果是没有按照插入的顺序来的。
所以,在关联容器存储的是指针类型时,需要我们自己指定对应的比较对象,是的,提供的应该是一个函数对象,因为容器模板的参数接受的是类型,并非是一般的函数哦。
总结下:
在使用关联容器时,如果存储的是指针,又想按照指针指向的对象的某个字段顺序存储,需要自己实现比较函数对象。作为第二个参数传入构造。