-数据结构 - 例如,列表,向量,比特向量和字符串。 C 语言的类型系统分为:基本类型和复合类型。...定义一个接口 I , 然后使用不同的结构体对接口 I 进行实现,然后利用接口对象作为形式参数,将不同类型的对象传入并调用相关的函数,实现多态。接口可以进行嵌套实现,通过大接口包含小接口。...现在我把它叫作我犯下的亿万美元错误。当时,我在一种面向对象语言中为引用设计第一个全面的类型系统。我的目标是让编译器来自动执行检查,确保所有使用引用的地方都是绝对安全的。...OOP 与接口类型 本节介绍面向对象编程的关键元素,以及什么时候使用每种元素,并讨论接口、继承、组合和混入。...Functor = unit + map(即工具) 在哪里, unit= 接受原始输入并将其包装在一个小上下文中的东西。
这里需要弄清楚一个问题,这里的相等,是指你提供的函数表示两个元素相等,并不一定是一摸一样的元素。...stable_sort采用的是"归并排序",分派足够内存是,其算法复杂度为n*log(n), 否则其复杂度为n*log(n)*log(n),其优点是会保持相等元素之间的相对位置在排序前后保持一致。...先看看其用途: 班上有10个学生,我想知道分数最低的5名是哪些人。如果没有partial_sort,你就需要用sort把所有人排好序,然后再取前5个。...begin()是第一个,begin()+1是第二个,... begin()+3当然就是第四个了。...从效率上看,以下几种sort算法的是一个排序,效率由高到低(耗时由小变大): partion stable_partition nth_element partial_sort sort stable_sort
limit(long maxSize) 截断流,使其元素不超过给定数量 skip(long n) 跳过元素,返回一个扔掉了前 n 个元素的流。...,返回一个扔掉了前 n 个元素的流。...其结果可以是任何不是流的值,例 如:List、Integer,甚至是 void 。 流进行了终止操作后,不能再次使用。...匹配与查找 allMatch(Predicate p) 检查是否匹配所有元素 anyMatch(Predicate p) 检查是否至少匹配一个元素 noneMatch(Predicate p) 检查是否没有匹配所有元素...findFirst() 返回第一个元素 findAny() 返回当前流中的任意元素 count() 返回流中元素总数 max(Comparator c) 返回流中最大值 min(Comparator
liftM liftM :: Monad m => (a1 -> r) -> m a1 -> m r 从类型声明来看,这不就是Functor的fmap嘛: fmap :: Functor f => (...(并且如果遵守Monad laws的话,就与fmap完全等价,仅将函数应用到具有context的值上,不做任何多余的事情),从这个角度看,Monad比Functor更强大 已经证明了Monad比Functor...) -> [a] -> m [a] 注意,predicate函数(a -> m Bool)的Bool返回值具有context了,这有什么作用?...,其参数顺序是当前元素和累加结果(分别对应上面的x和ma,ma的初始值是pure []),liftA2 :: Applicative f => (a -> b -> c) -> f a -> f b -...Foldable t, Monad m) => (b -> a -> m b) -> b -> t a -> m b 例如: > foldl (\a x -> a + x) 0 [1..10] 55 P.S.一个小细节
三种,前两种用于多生产者/多消费者场景,第三个用于单生产者/单消费者场景,下面对它们的使用进行详细介绍,以boost::lockfree::stack为例,其他类似。...has_capacity); initialize(); } boost::lockfree::stack的第一个模板参数是元素类型,后面3个参数是用来配置stack的,没有顺序要求: boost::lockfree...::fixed_sized:是否固定大小,默认为boost::lockfree::fixed_sized,如果为true,则内部使用数组保存元素,大小不能动态增长; boost::lockfree...lockfree::stack, boost::lockfree::capacity> s3; 成员方法 push:压入一个元素到容器...(Functor const & f) _one表示只消费1个元素; _all表示消费所有元素; _atomic表示消费过程是原子的,其间其他操作对其是不可见的。
std::find_if http://www.cplusplus.com/reference/algorithm/find_if/ 查找集合中第一个满足指定胃词的元素,返回一个迭代器,指向字符串中满足胃词函数的第一个字符...,它可以在前两个参数指定的范围内查找可以使第三个参数指定的谓词返回 true 的第一个对象。...符合谓词条件的元素移动到集合的前面,不符合条件的元素移动到集合的后面,算法返回一个迭代器,指向第二部分的第一个元素(不符合谓词条件的第一个元素)。...对于一个非空向量,可以递归地处理它的头(第一个元素)和尾(所有其他元素),这又可以被看作一个向量。如果头满足谓词,则把它包含在结果中,如果接收一个空向量,则什么也不需要处理,返回一个空向量。...tail函数的问题可由一对迭代器代替向量作为输入来解决,在这种情况下,获取向量尾变得很简单——只需要移动迭代器,使他指向第一个元素即可。
然后,对每个累加数字和的数组项调用summary函数。 提示: 如果没有使用 initialValue 来设置初始值,则默认使用数组的第一个元素作为初始值。 4....) 方法返回数组中满足提供的测试函数的第一个元素的值。...// 1 提示: 如果找不到该项,则array.indexOf(itemToSearch)返回-1 array.findIndex(predicate)是使用predicate函数查找索引的替代方法...数组的过滤 9.1 array.filter() 方法 array.filter(predicate)方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。...11.2 array.shift() 方法 array.shift()方法从数组中删除第一个元素,然后返回该元素。
然后,对每个累加数字和的数组项调用summary函数。 提示: 如果没有使用 initialValue 来设置初始值,则默认使用数组的第一个元素作为初始值。 4....) 方法返回数组中满足提供的测试函数的第一个元素的值。...// 1 提示: 如果找不到该项,则array.indexOf(itemToSearch)返回-1 array.findIndex(predicate)是使用predicate函数查找索引的替代方法。...数组的过滤 9.1 `array.filter()` 方法 array.filter(predicate)方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。...11.2 `array.shift()` 方法 array.shift()方法从数组中删除第一个元素,然后返回该元素。
10.1 函数对象适配器 Bind2nd 是一个函数适配器,可以用来将一个双参函数转换成一个单参函数。使用该适配器可以修改函数中的第二个参数,而将第一个参数保持不变。...); 其中Predicate是一个一元谓词,而返回值是一个封装了谓词的std::unary_negate对象,它是一个可调用的函数对象,并可以在STL的算法函数中使用。...下面是一个使用not1的例子,我们想要找到第一个大于5的数是多少,但由于加上了not1取反,则输出的数据为小于5的数据。...这两种适配器都是在使用中间层的帮助下实现容器的插入操作,其主要作用是在输出迭代器(通常是一个容器)的末尾自动添加新的元素。...下面是具体用例,通过使用插入迭代器我们可以将一组数据插入到容器中的前或后等位置。
函数类型的 , 需要传入一个函数类型实例作为其参数 ; II ...., minBy 是获取元素某字段最小值的第一个元素 minBy 函数原型 : 获取集合中某个元素的某个字段最小值的元素 , 如果有多个最小值元素 , 那么返回第一个 ; /** * Returns...: 返回值是 T 类型 , 该集合中如果存在符合某种条件的元素 , 返回第一个该元素 , 使用 ?...)) checkCountOverflow(++count) return count } find 高阶函数 : 查找第一个符合条件的元素...true 的元素集合的第一个元素 predicate: (T) -> Boolean 函数类型 : public inline fun Iterable<T
作用与用法 baseFindIndex 是内部方法,其作用类似于ES6的 findIndex,查找符合条件的第一个元素的索引。...从代码中很容易看到,predicate 是传递进来的函数,在 baseFindIndex 调用该函数,如果返回的结果为真值,则中止查找,返回索引。...index-- : ++index < length 在向前查找时,使用的是 index-- 表达式的运算结果,向后查找时,使用的是 ++index < lenth 表达式的运算结果。...前缀自增返回的是自增后的结果,而在循环条件中就要将索引 index 增加1,这样会忽略掉第一个需要遍历的元素,作为补救,在开始遍历前,需要将 index 减少1。...因为在向前查找时,最终要查找到数组索引 0 的位置,后缀自减返回的是自减前的数值,因此当 index 为 1 时,自减后的 index 为 0 ,但是在循环条件中依然拿 1 来进行判断,所以使得索引 0
使用该适配器可以修改函数中的第二个参数,而将第一个参数保持不变。...;其中Predicate是一个一元谓词,而返回值是一个封装了谓词的std::unary_negate对象,它是一个可调用的函数对象,并可以在STL的算法函数中使用。...下面是一个使用not1的例子,我们想要找到第一个大于5的数是多少,但由于加上了not1取反,则输出的数据为小于5的数据。...这两种适配器都是在使用中间层的帮助下实现容器的插入操作,其主要作用是在输出迭代器(通常是一个容器)的末尾自动添加新的元素。...下面是具体用例,通过使用插入迭代器我们可以将一组数据插入到容器中的前或后等位置。
假设我们有一组Predicate,我们希望输出这样一组数据,即输出True所属第几个,例如第一个T输出0,第二个是F,则输出 —,遍历到第二个T输出1,以此类推。 我们可以用什么运算方法实现呢?...问题是如何针对Predicate、Scan、Scatter三个运算而言,上面两个操作哪一个更快或者使用时间相同。 ?...例如第一个输入元素值是1,那么他的输出值则为0,表示index=0的空间需要分配给第一个输出元素。...冒泡排序 下面举个栗子: 对 [5 1 4 2 3]使用冒泡排序: 我们都知道串行方式的冒泡排序是每次都需要比较相邻的元素。如果第一个比第二个大,就交换他们两个。...再仔细回顾一下归并排序,其主要思想是以大化小,然后拼接排序。如下图示,假设已经得到了两个有序数组。接下来要做的是就是分别比较两个数组中的第一个元素,然后输出较小的元素。迭代这一过程直到完成排序。 ?
使用流可以帮助我们处理对象,无需迭代集合中的元素,即可直接提取和操作元素,并添加了很多便利的操作,例如查找、过滤、分组、排序等一系列操作。...因为流可能为空,其返回值为 Optional reduce(identity, BinaryOperator) 功能同上,但是使用 identity 作为其组合的初始值。...在第一个 false 时,则停止执行计算 anyMatch(Predicate) 如果流的任意一个元素提供给 Predicate 返回 true ,结果返回为 true。...在第一个 true 是停止执行计算 noneMatch(Predicate) 如果流的每个元素提供给 Predicate 都返回 false 时,结果返回为 true。...查找 findFirst() 返回第一个流元素的 Optional,如果流为空返回 Optional.empty findAny( 返回含有任意流元素的 Optional,如果流为空返回 Optional.empty
:从菜单列表中,查找出是素食的菜品,并打印其菜品的名称。...super T> predicate); 接收一个谓词函数(T->boolean),返回一个boolean值,是一个终端操作,用于判断流中的所有元素是否与Predicate相匹配,只要其中一个元素不复合...super T> predicate) 2 同样接收一个谓词Predicate( T -> boolean ),表示只要流中的元素至少一个匹配谓词,即返回真。...findFirst 查找流中的一个元素,其函数声明如下: 1Optional findFirst(); 返回流中的一个元素。...,其实第一个参数为初始值T identity,第二个参数为流中的元素。
也就是说,我们在设计一种算法的时候,我们总是先要考虑其应用的数据结构,比如数组查找,联表查找,树查找,图查找其核心都是查找,但因为作用的数据结构不同将有多种不同的表现形式。... 双端队列deque 基本上与向量相同,唯一的不同是,其在序列头部插入和删除操作也具有常量时间复杂度 表list 对任意元素的访问与对两端的距离成正比,但对某个位置上插入和删除一个项的花费为常数时间...insert()可以加入一个对象,一个对象的若干份拷贝,或者一个范围以内的对象。 list成员函数pop_front()删掉list中的第一个元素,pop_back()删掉最后一个元素。...remove从一个容器中remove元素不会改变容器中元素的个数,erase是真正删除东西。 13、提防在指针的容器上使用类似remove的算法,在调用类似remove的算法前手动删除和废弃指针。...,会导致程序行为不可知.究其原因是map 是关联容器,对于关联容器来说,如果某一个元素已经被删除,那么其对应的迭代器就失效了,不应该再被使用;否则会导致程序无定义的行为。
的时候, ex2:Core Algorithm to Compact [image.png] 假设我们有一组Predicate,我们希望输出这样一组数据,即输出True所属第几个,例如第一个T输出0,第二个是...问题是如何针对Predicate、Scan、Scatter三个运算而言,上面两个操作哪一个更快或者使用时间相同。...[image.png] 例如第一个输入元素值是1,那么他的输出值则为0,表示index=0的空间需要分配给第一个输出元素。...冒泡排序 下面举个栗子: 对 5 1 4 2 3使用冒泡排序: 我们都知道串行方式的冒泡排序是每次都需要比较相邻的元素。如果第一个比第二个大,就交换他们两个。...再仔细回顾一下归并排序,其主要思想是以大化小,然后拼接排序。如下图示,假设已经得到了两个有序数组。接下来要做的是就是分别比较两个数组中的第一个元素,然后输出较小的元素。迭代这一过程直到完成排序。
) 中特别常见 , 尤其是在 STL 算法中 , 因为它们可以用作自定义操作 , 以适应各种不同的需求 ; 例如 : 使用 一元函数对象 来定义一个操作 , 该操作将被应用于容器中的每个元素 ; 在上一篇博客..., 返回一个布尔类型的测试结果 , 根据不同的结果执行不同的操作 ; " 谓词 ( Predicate ) " 类型 : 普通函数 函数指针 重载了 函数调用操作符 的 函数对象 / 仿函数 , 有...中查找满足特定条件的第一个元素 ; find_if 算法 的原理是 : 执行该算法时 , 遍历容器序列 , 对每个元素应用指定的 一元谓词 ; 如果 找到满足 一元谓词 返回 true 的元素 , 则返回...执行该算法时 , 遍历容器序列 , 对每个元素应用指定的 一元谓词 , 这里会查找满足 值等于 4 的元素 ; 如果找到满足 一元谓词 返回 true 的元素 , 则返回 指向该元素的迭代器 ; 如果没有找到满足..."); return 0; }; 2、执行结果 执行结果 : 找到了第一个等于 4 的数 : 4 请按任意键继续. . .
领取专属 10元无门槛券
手把手带您无忧上云