C++ 容器算法
容器算法
<algorithm>
是c++
自带的容器算法,提供一系列实用的算法。在谈到容器算法,我们大概率会用到谓词predicate
,谓词返回的类型是布尔类型(bool)
可以是lambda
表达式、函数对象以及其它可调用的对象。
查找
find()
查找元素find
接受三个参数,第三个参数是值类型,set
、map
自带count
函数也能实现这样的功能,返回值0
表示不存在。为了方便本次连带find_if
、find_if_not
、find_first_of
、find_end
和adjacent_find
一起举例。
去重
unique(nums.begin(), nums.end())
除掉连续相同的值
unique
函数的作用是删除掉的连续的相同的值,unique 还支持传入二元谓词(可以理解为一个参数的函数),会返回一个迭代器it
,但是并不是end()
,中间是未指定的值(访问可能会产生未定义行为)。注意不要用set
和map
,返回的都是常量迭代器是无法改变的,即其指向的元素无法改变。
unique_copy()
除掉连续相同的值并复制到目标容器
注意,使用此函数之前先分配空间,再使用unique_copy
并不进行内存分配,只是赋值给另一个容器,如果访问未赋值部分的容器区域,那么会产生未定义行为。同样,也支持二元谓词,通过二元谓词判定移除连续值。
排序
sort()
对容器进行排序sort
用于实现容器元素的排序,sort 也同样接受二元谓词
迭代器差值
distance()
求迭代之间距离distance
用于求算两个迭代器之间的差值,只用于同一容器,set
,map
,vector
都可以用。
遍历容器
for_each()
和for_each_n
遍历容器每个元素并执行函数规定的操作,第三个参数是一个函数。如果要对迭代器指向的元素修改,那么set
就是不可以的,因为set
返回的是常量迭代器。
复制元素
copy()
能够将容器中的元素复制到输出迭代器之后out iterator
copy_backward()
能够将容器中元素复制到输出迭代器之前。
map、set
类也不支持。这个容器算法会覆盖掉输出迭代器之前的元素
全排列
next_permutation
提供返回容器的一个全排列,也支持一个二元谓词。
取集合
set_intersection
取交集、set_union
取并集、set_difference
取单侧差集,set_symmetric_difference
取两侧差集,值得注意的是set_difference
在输出到结果容器中只会输出第一个容器中的元素(不管第一个容器的元素是否少于第二个容器的元素)。这四个函数都接受一个二元谓词。注意:map
和set
都无法使用,因为这三个函数底层实现都需要用到自增运算符,而 map 和 set 只有常量迭代器不支持这样的操作。应用场景:vector
等容器。
搜索
search
搜索串中的子序列,search_n
搜索串中固定数量的连续重复值。search_n
接受一个二元谓词,两个函数都能够使用set
和map
。search
接受一个searcher
可调用对象,但是search_n
对于set
是没有意义的,因为set
中不存在重复值
文章转载自:LemHou
评论