- 论坛徽章:
- 0
|
结果当然是false。 也就是说,set得出的结论是10A与10B不等价,因此不一样,于是它将10B插入容器中10A的
旁边。在技术上而言,这个做法导致未定义的行为,但是通常的结果是set以拥有了两个为10的值的拷贝而告
终,也就是说它不再是一个set了。通过使用less_equal作为我们的比较类型,我们破坏了容器!此外,任何对
相等的值返回true的比较函数都会做同样的事情。是不是很酷?
OK,也许你对酷的定义和我不一样。就算这样,你仍然需要确保你用在关联容器上的比较函数总是对相等
的值返回false。但是,你需要保持警惕。对这条规则的违反容易达到令人吃惊的后果。
举个例子,条款20描述了该如何写一个比较函数以使得容纳string*指针的容器根据string的值排序,而不是对
指针的值排序。那个比较函数是按升序排序的,但我们现在假设你需要string*指针的容器的降序排序的比较
函数。自然是抓现成的代码来修改了。如果你不细心,可能会这么干,我已经加亮了对条款20中代码作了改
变的部分:
struct StringPtrGreater: // 高亮显示
public binary_function<const string*, // 这段代码和89页的改变
const string*, // 当心,这代码是有瑕疵的!
bool> {
bool operator()(const string *ps1, const string *ps2) const
{
return !(*ps1 < *ps2); // 只是相反了旧的测试;
} // 这是不对的!
};
这里的想法是通过将比较函数内部结果取反来达到反序的结果。很不幸,取反“<”不会给你(你所期望
的)“>”,它给你的是“>=”。而你现在知道,因为它将对相等的值返回true,对关联容器来说,它是一
个无效的比较函数。
你真正需要的比较类型是这个:
struct StringPtrGreater: // 对关联容器来说
public binary_function<const string*, // 这是有效的比较类型
const string*,
bool> {
bool operator()(const string *ps1, const string *ps2) const
{
return *ps2 < *ps1; // 返回*ps2是否 |
|