19. 理解相等和等价的区别
优先使用容器的成员函数进行查找
if(!(w1 < w2)&&!(w2 < w1)){}//为真时表示关系等价
set<string, CIStringCompare> ciss;//CIStringCompare 不区分字母大小写
ciss.insert("Persephone");
ciss.insert("persephone");//没有新元素插入
if(ciss.find("persephone")!=ciss.end()){}//查找成功
if(find(ciss.begin(), ciss.end(), "persephone")!=ciss.end()){}//查找失败
20. 为包含指针的关联容器指定比较类型
set<string*> ssp;
//set<string*, less<string*>, allocator<string*>> ssp;
struct StringPtrLess:public binary_function<const string*, const>
{
bool operator()(const string *ps1, const string *ps2)const
{
return *ps1 < *ps2;
}
};
set<string*, StringPtrLess> ssp;
21.总是让比较函数在等值的情况下返回false
equal_range 找不到相应的值,判断规则是
if(!(w1 < w2)&&!(w2 < w1)){}//为真时表示关系等价
22. 切勿直接修改set或multiset中的键
map和multimap中的元素是const
map<int, string> m;
//....
m.begin()->first = 10;//键值不能修改
multimap<int, string> mm;
//...
mm.begin()->first = 20;//键值不能修改
set和multiset中的元素不是const,这是为了具体的应用,如下
struct IDNumberLess:
:public binary_function<Employee, Employee, bool>
{
bool operator()(const Employee& lhs, const Employee& rhs)const
{
return lhs.idNumber() < rhs.idNumber();
}
};
typedef set<Employee, IDNumberLess> EmpIDSet;
EmpIDSet se;
Employee selectedId;
EmpIDSet::iterator i = se.find(selectId);
if(i!=se.end())
{
i->setTitle("Corporate Deity");//有些编译STL认为不合法
}
如果某些STL无法实现上述方法,则采用通用的方法,先查找到相应的元素迭代起,然后删除,同时插入新的值代替刚才删去的
if(i!=se.end())
{
Emplyee e(*i);
e.setTitle("Corporate Deity");
se.erase(i++);
se.insert(i, e);
}
23. 考虑用排序的vector代替关联容器
1. 设置阶段
2. 查找阶段
3.重组阶段
vector<Widget> vw;
sort(vw.begin(), vw.end());
Wiget w;
if(binary_search(vw.begin(), vw.end(), w)){}//binary_search 返回bool确定该值是否存在
vector<Widget>::iterator i = lower_bound(vw.begin(), vw.end(), w);
if(i!=vw.end() &&!(w<*i)){}
pair<vector<Widget>::iterator, vector<Widget::iterator> range = equal_range(vw.begin(), vw.end(), w);
if(range.first != range.second)
24.当效率至关重要时,请在map::operator[]与map::insert之间谨慎做选择
map<int, Widget> m;
typedef map<int, Widget> IntWidgetMap;
m[1] = 1.50;//效果等通insert
m.insert(IntWidgetMap::value_type(1, 1.50));//相比节省三个函数调用
25. 熟悉非标准的哈希容器