现在,s里面有二个10的元素拷贝,因此我们期望,如果我们在它上面做一个equal_range,我们将会得到一对iterator以指出包含这两个拷贝的范围。但那是不可能的。equal_range,名不符实,不是指示出相同的元素的范围,而是等值的元素的范围。在这个例子中,s的比较函数说10a和10b是不等值的,所以不可能让它们同时出现在equal_range所指示的范围内。
你明白了吗?除非你的比较函数总是为相同的元素返回false,你将会打破所有的关联型容器,不管它们是否允许存储复本。
从技术上讲,用于关联容器的比较函数必须在它们所比较的对象上定义一个“strict weak ordering”。 ( 传给sort(item 31)等泛型算法的比较函数也有同样的限制)。如果你对strict weak ordering的含义细节感兴趣,可在很多stl指导书籍中找到,比如josuttis的《the c++ standard library》(wq注:中文版p176,英文版电子p156),austern的《generic programming and the stl 》,和sgi stl的网站。 我从未发现这个细节如此重要,但一个对strict weak ordering的要求直接瞄上了这个item。 那个要求就是任何定义了一个strict weak ordering 的函数都必须在传入相同元素的两个拷贝时返回false。
嗨! 那是这个item!