非修改性序列操作(12个)
循环
|
|
对序列中的每个元素执行某操作 |
for_each() |
查找
|
|
在序列中找出某个值的第一次出现的位置 |
find() |
在序列中找出符合某谓词的第一个元素 |
find_if() |
在序列中找出一子序列的最后一次出现的位置 |
find_end() |
在序列中找出第一次出现指定值集中之值的位置 |
find_first_of() |
在序列中找出相邻的一对值 |
adjacent_find() |
计数
|
|
在序列中统计某个值出现的次数 |
count() |
在序列中统计与某谓词匹配的次数 |
count_if() |
比较
|
|
找出两个序列相异的第一个元素 |
mismatch() |
两个序列中的对应元素都相同时为真 |
equal() |
搜索
|
|
在序列中找出一子序列的第一次出现的位置 |
search() |
在序列中找出一值的连续n次出现的位置 |
search_n() |
修改性序列操作(27个)
复制
|
|
从序列的第一个元素起进行复制 |
copy() |
从序列的最后一个元素起进行复制 |
copy_backward() |
交换
|
|
交换两个元素 |
swap() |
交换指定范围的元素 |
swap_ranges() |
交换由迭代器所指的两个元素 |
iter_swap() |
变换
|
|
将某操作应用于指定范围的每个元素 |
transform() |
替换
|
|
用一个给定值替换一些值 |
replace() |
替换满足谓词的一些元素 |
replace_if() |
复制序列时用一给定值替换元素 |
replace_copy() |
复制序列时替换满足谓词的元素 |
replace_copy_if() |
填充
|
|
用一给定值取代所有元素 |
fill() |
用一给定值取代前n个元素 |
fill_n() |
生成
|
|
用一操作的结果取代所有元素 |
generate() |
用一操作的结果取代前n个元素 |
generate_n() |
删除
|
|
删除具有给定值的元素 |
remove() |
删除满足谓词的元素 |
remove_if() |
复制序列时删除具有给定值的元素 |
remove_copy() |
复制序列时删除满足谓词的元素 |
remove_copy_if() |
唯一
|
|
删除相邻的重复元素 |
unique() |
复制序列时删除相邻的重复元素 |
unique_copy() |
反转
|
|
反转元素的次序 |
reverse() |
复制序列时反转元素的次序 |
reverse_copy() |
环移
|
|
循环移动元素 |
rotate() |
复制序列时循环移动元素 |
rotate_copy() |
随机
|
|
采用均匀分布来随机移动元素 |
random_shuffle() |
划分
|
|
将满足某谓词的元素都放到前面 |
partition() |
将满足某谓词的元素都放到前面并维持原顺序 |
stable_partition() |
序列排序及相关操作(27个)
排序
|
|
以很好的平均效率排序 |
sort() |
排序,并维持相同元素的原有顺序 |
stable_sort() |
将序列的前一部分排好序 |
partial_sort() |
复制的同时将序列的前一部分排好序 |
partial_sort_copy() |
第n个元素
|
|
将第n各元素放到它的正确位置 |
nth_element() |
二分检索
|
|
找到大于等于某值的第一次出现 |
lower_bound() |
找到大于某值的第一次出现 |
upper_bound() |
找到(在不破坏顺序的前提下)可插入给定值的最大范围 |
equal_range() |
在有序序列中确定给定元素是否存在 |
binary_search() |
归并
|
|
归并两个有序序列 |
merge() |
归并两个接续的有序序列 |
inplace_merge() |
有序结构上的集合操作
|
|
一序列为另一序列的子序列时为真 |
includes() |
构造两个集合的有序并集 |
set_union() |
构造两个集合的有序交集 |
set_intersection() |
构造两个集合的有序差集 |
set_difference() |
构造两个集合的有序对称差集(并-交) |
set_symmetric_difference() |
堆操作
|
|
向堆中加入元素 |
push_heap() |
从堆中弹出元素 |
pop_heap() |
从序列构造堆 |
make_heap() |
给堆排序 |
sort_heap() |
最大和最小
|
|
两个值中较小的 |
min() |
两个值中较大的 |
max() |
序列中的最小元素 |
min_element() |
序列中的最大元素 |
max_element() |
词典比较
|
|
两个序列按字典序的第一个在前 |
lexicographical_compare() |
排列生成器
|
|
按字典序的下一个排列 |
next_permutation() |
按字典序的前一个排列 |
prev_permutation() |
函数对象类模板
函数对象类模板 |
成员函数 T operator ( const T & x, const T & y) 的功能 |
plus |
return x + y; |
minus < > |
return x - y; |
multiplies |
return x * y; |
divides |
return x / y; |
modulus |
return x % y; |
|
|
|
成员函数 bool operator( const T & x, const T & y) 的功能 |
equal_to |
return x == y; |
not_equal_to |
return x! = y; |
greater |
return x > y; |
less |
return x < y; |
greater_equal |
return x > = y; |
less_equal |
return x <= y; |
logical_and |
return x && y; |
logical_or |
return x || y; |
|
|
|
成员函数 T operator( const T & x) 的功能 |
negate |
return - x; |
|
|
|
成员函数 bool operator( const T & x) 的功能 |
logical_not |
return ! x; |
拓展
二分查找
template<class InputIterator, class T>
InputIterator bfind(InputIterator first, InputIterator end, const T& key)
{
InputIterator l = first;
InputIterator r = end-1;
InputIterator mid;
while(l <= r)
{
mid = l + distance(l, r)/2;
if(*mid > key)
r = mid - 1;
else if(key > *mid )
l = mid + 1;
else
return mid;
}
return end;
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char* argv[])
{
vector<int> ivec { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20 };
vector<int>::iterator iter = bfind(ivec.begin(), ivec.end(), 4);
if (iter != ivec.end())
cout << *iter << endl;
else
cout << "not find" << endl;
return 0;
}