假设建立一个包含Sting*指针的set
#include<iostream>
#include<algorithm>
#include<string>
#include<set>
using namespace std;
int main()
{
set<string*> sp;
sp.insert(new string("A"));
sp.insert(new string("B"));
sp.insert(new string("C"));
sp.insert(new string("D"));
for (set<string*>::const_iterator iter = sp.begin(); iter != sp.end(); ++iter)
{
cout << *iter << endl;
}
}
显示的是存放数据的地址的十六进制数,如果将输出改为**iter
#include<iostream>
#include<algorithm>
#include<string>
#include<set>
using namespace std;
int main()
{
set<string*> sp;
sp.insert(new string("A"));
sp.insert(new string("B"));
sp.insert(new string("C"));
sp.insert(new string("D"));
for (set<string*>::const_iterator iter = sp.begin(); iter != sp.end(); ++iter)
{
cout << **iter << endl;
}
getchar();
}
好了,现在好像得到了我们想要的输出,但作为关联容器,好像又不满足它本身具有按值进行排序的性质,如果输出偶然是有序的,那也是1/24的概率;
为了解决这个问题
我们必须给它指定一个比较函数子类,代替默认的函数子类:
这里要注意是比价函数子类,而不是比较函数,因为在set<VALUE,Compare>中,Compare不是一个函数,而是一个类型,并在内部用它创建一个函数。
#include<iostream>
#include<algorithm>
#include<string>
#include<set>
using namespace std;
struct Compare
{
bool operator()(const string *p1, const string *p2)//函数调用重载
{
return *p1 < *p2;
}
};
int main()
{
set<string*,Compare> sp;
sp.insert(new string("A"));
sp.insert(new string("B"));
sp.insert(new string("C"));
sp.insert(new string("D"));
for (set<string*>::const_iterator iter = sp.begin(); iter != sp.end(); ++iter)
{
cout << **iter << endl;
}
getchar();
}
总结:这种方法不仅适用于包含指针的关联容器,同样也适用于其他一些容器,这些容器中所包含的对象与指针行为相似,比如智能指针和迭代器。如果有一个包含智能指针或迭代器的容器,那么也要考虑为它指定一个比较类型。