相等性 vs 等价性

问题: 以下两个find的结果分别指向什么?

class Lsb_less {
public:
bool operator()(int x, int y) {
return (x%10)<(y%10);
}
}; set<int, Lsb_less> s = {21, 23, 26, 27}; //自定义比较方法 set<int, Lsb_less>::iterator itr1, itr2; itr1 = find(s.begin(), s.end(), 36); // 指向s.end() itr2 = s.find(36); // 指向26

为什么不一样?

set<int, Lsb_less> s = {21, 23, 26, 27};

/*
* 算法find()寻找相等性: if (x == y)
*/ itr1 = find(s.begin(), s.end(), 36); // itr1指向s.end() /*
* set<int>::find()寻找等效性: if ( !(x<y) && !(y<x) )
*/ itr2 = s.find(36); // itr2 points to 26

总结

  • 如果函数使用<运算符或类似函数,它检查等效性。通常它是用于已排序数据的算法,或者已排序数据容器的成员函数,如关联容器。

  • 如果函数使用 == 运算符或类似函数,它检查相等性。通常不要求数据已排序。

  • 相等性的算法:

    search

    find_end

    find_first_of

    adjacent_search

  • 等效性的算法:

    binary_search // simple forms

    includes

    lower_bound

    upper_bound

  • 当使用某个函数搜索或者删除元素时,确保你理解了相等性和等效性之间的区别。

STL进阶--相等 vs 等价 (Equality vs Equivalence)的更多相关文章

  1. STL进阶--vector vs deque

    vector class Dog; // 例 1: vector<Dog> vec(6); // vec.capacity() == 6, vec.size() == 6, // 默认构造 ...

  2. STL进阶--删除元素

    删除元素 从vector或deque删除元素 vector<int> vec = {1, 4, 1, 1, 1, 12, 18, 16}; // 删除所有的1 for (vector< ...

  3. STL进阶--狡猾的反向迭代器

    反向迭代器 两种声明反向迭代器的方法 reverse_iterator<vector<int>::iterator> ritr; vector<int>::reve ...

  4. STL进阶--成员函数 vs 算法

    容器的成员函数 vs 算法 容器中同名的函数 List: void remove(const T); template<class Comp> void remove_if(Comp); ...

  5. [GeekBand] STL与泛型编程(2)

    本篇文章在上一篇文章的基础上进一步介绍一些常用的容器以及STL的一些深入知识. 一. Stack和Queue 栈和队列是非常常用的两种数据结构,由deque适配而来.关于数据结构的知识这里就不在介绍了 ...

  6. C++学习书籍推荐《Effective STL(英文)》下载

    百度云及其他网盘下载地址:点我 作者简介 Scott Meyers is one of the world's foremost authorities on C++, providing train ...

  7. 【转】三十分钟掌握STL

    转自http://net.pku.edu.cn/~yhf/UsingSTL.htm 三十分钟掌握STL 这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以 ...

  8. C++STL之迭代器

    迭代器 迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围.迭代器就如同一个指针.事实上,C++的指针也是一种迭代器.但是,迭代器不仅仅是指针,因此你不能认为他们一定具有地址值.例如, ...

  9. 三十分钟掌握STL

    这是本小人书.原名是<using stl>,不知道是谁写的.不过我倒觉得很有趣,所以化了两个晚上把它翻译出来.我没有对翻译出来的内容校验过.如果你没法在三十分钟内觉得有所收获,那么赶紧扔了 ...

随机推荐

  1. vim 删除

    shift + $ :光标往后 shift + ^ :光标往前 shift + D 删除当前光标直到末尾

  2. Arcgis发布服务

    1.文件<<共享为<<服务. 2.发布服务<<在下拉菜单选择已经创建的server连接,输入服务名称<<选择服务发布的位置(默认在根目录下,也可以在子文 ...

  3. macbook air 获取root权限

    以下内容为转载 原创连接:http://blog.itpub.net/26148431/viewspace-1401745/ 1. 从 Apple 菜单中选取系统偏好设置,从显示菜单中选取用户与群组. ...

  4. Js判断字符的种类

    Js判断字符的种类:unicode范围: 48-57:0-9    数字字符 65-90:A-Z    大写字母 97-122: a-z  小写字母 19968-40869:汉字 其他字符 实例:输出 ...

  5. POJ3904 Sky Code

    题意 Language:Default Sky Code Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3980 Accepte ...

  6. linux内核编程helloworld(中级)

    传入参数 [root@bogon modules]# cat first.c #include<linux/kernel.h> #include<linux/stat.h> # ...

  7. Servlet拓展

    一. 概念 1.Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务      连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据, ...

  8. Java打印水仙花数

    public class Test2 { public static void main(String[] args) { //水仙花 数 指的是一个三位数(100-999) //三位数本身= 百位数 ...

  9. LED硬件访问服务(2)——JNI/HAL

    一.系统编程 1.SystemServer.java类中提供了main()方法,说明它是以一个进程的方式存在的,启动后直接执行其run() 2.注册服务ServiceManager.addServic ...

  10. linux下PHP手动添加扩展库

    1.进入php源程序目录中的ext目录中,这里存放着各个扩展模块的源代码,选择你需要的模块,比如curl模块: cd curl 执行phpize生成编译文件,phpize在PHP安装目录的bin目录下 ...