您的位置:首页 > Web前端

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

2016-09-22 19:31 405 查看
#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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: