Efftive STL 关联容器


1. 理解相等和等价的区别

find方法的“相同”的定义是相等,是以operator==为基础的,
set::insert的“相同”的定时则是等价,是以operator < (less)为基础的,即

if(!(v1 < v2) and !(v2 < v1))
关联容器的等价即为:
!(c.key_comp()(x,y)) and (!(c.key_comp()(y,x)))
举个例子: 

//Compare 类型
内部仿函数不区分大小写比较
set ciss;
ciss.insert("Person");//succ 
ciss.insert("person"); //fail,不会被插入ciss 
if(ciss.find(“Person”) != ciss.end()) 
{ 
      //成功 
} 
if(find(ciss.begin(),ciss.end(),"Person") != ciss.end()) 
{
      //失败,原因如上描述 
} 

优先使用关联容器自己的比较函数(一般都是less函数) 

2.为包含指针的关联容器指定比较类型

struct StringPtrLess
{
	bool operator()(const string *ps1, const string* ps2)
	{
		return *ps1 < *ps2;	
	}
}

using StringPtrSet = set;

StringPtrSet ss;
using iter = StringPtrSet::const_iterator;
for(iter i = ss.begin(); i != ss.end(); i++)
{
	cout << **i <
						  
					  
STL