effective stl: 第20条,为包含指针的关联容器指定比较类型

#include<iostream>
#include<string>
#include<algorithm>
#include<map>
#include<set>

using namespace std;
struct stringPtrLess :
    public binary_function<const string*, const string*,bool>{
    bool operator()(const string* lptr, const string* rptr) const
    {
        return *lptr < *rptr;
    }
};
struct Dereference{
    template<typename T>
    const T& operator()(const T *ptr)const
    {
        return *ptr;
    }
};
void print(const string* ps)
{
    cout << *ps << endl;
}
bool Cmp(const string* ptr, const string* ptr2)
{
    return *ptr < *ptr2;
}
int main()
{

    set<string*> ssp;
    ssp.insert(new string("Anteater"));
    ssp.insert(new string("Wombat"));
    ssp.insert(new string("Lemur"));
    ssp.insert(new string("Panguin"));
    //以下方式不会是按照字母排序顺序出现的动物名称,而是4个16进制数--它们是指针的值
    for (set<string*>::const_iterator i = ssp.begin(); i != ssp.end(); i++)
    {
        cout << *i << endl;
    }
    //避免编写自己的循环,如果换一种方式,但是这种方式不能通过编译,因为传给
    //ostream_iterator的参数是string和string*不符合
    //copy(ssp.begin(), ssp.end(), ostream_iterator<string>(cout, "\n"));

    //方式1:
    set<string*, stringPtrLess> sssp;
    sssp.insert(new string("Anteater"));
    sssp.insert(new string("Wombat"));
    sssp.insert(new string("Lemur"));
    sssp.insert(new string("Panguin"));
    for (set<string*, stringPtrLess>::const_iterator i = sssp.begin(); i != sssp.end(); i++)
    {
        cout << **i << endl;
    }
    //方式2:
    cout << "方式2:" << endl;
    for_each(sssp.begin(), sssp.end(), print);
    //方式3
    cout << "方式3:" << endl;
    //通过解除指针引用,“转换”sssp中的每个元素并把结果写入cout
    transform(sssp.begin(), sssp.end(), ostream_iterator<string>(cout, "\n"), Dereference());

    //注意,因为set的3个参数需要的是类型,而不是函数,因此下边的做法不可取
    //set<string, Cmp> errorSet;

    return 0;
}

每当创建包含指针的关联容器时,也要记住为该容器指定比较类型,大多数情况下,这个比较类型只是解除指针的引用,并对指针指向的对象进行比较,下边是一个为这样比较函数准备的一个模板。

struct Dereference{
    template<typename PtrType>
    bool operator()(PtrType pt1, PtyType pt2)
    {
        return *ptr1 < *ptr2;
    }
};
set<string*, Dereference> ssssp;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值