//一下代码都是演示使用,没有具体测试,使用时请查阅MSDN等相关资料。
#include <algorithm>
#include <vector>
using namespace std;
bool equal1 (int x)
{
return x == 5;
}
bool equal2 (int x, int y)
{
return x * 2 == y;
}
bool lesser(int x, int y)
{
return x < y;
}
int rand1 (int i) { return rand() % i; }
int to1(int x)
{
return x * 5;
}
int to2(int x, int y)
{
return x + y;
}
void main(int argc, char* argv[])
{
int i,j;
vector<int> vecInt1;
vector<int> vecInt2;
vector<int> vecInt3;
//adjacent_find
//搜索满足条件的相邻元素
adjacent_find(vecInt1.begin(), vecInt1.end());
adjacent_find(vecInt1.begin(), vecInt1.end(),equal2);
//binary_search
//使用二分法检查有序区间里是否有某个元素存在
binary_search(vecInt1.begin(), vecInt1.end(), 10);
binary_search(vecInt1.begin(), vecInt1.end(), 10, equal2);
//copy
//拷贝复制源数据到目的数据区,目的数据区必须能够容纳下源数据
copy(vecInt1.begin(), vecInt1.end(), vecInt2.begin() + 5);
//和inserter一起使用
//前面插入
copy(vecInt1.begin(), vecInt1.end(), front_inserter(vecInt2));
copy(vecInt1.begin(), vecInt1.end(), inserter(vecInt2,vecInt2.begin()));
//后面插入
copy(vecInt1.begin(), vecInt1.end(), back_inserter(vecInt2));
copy(vecInt1.begin(), vecInt1.end(), inserter(vecInt2,vecInt2.end()));
//copy_backward
//向后拷贝
copy_backward(vecInt1.begin(), vecInt1.end(), vecInt2.begin() + 10);
//count/count_if
//统计数据中满足条件元素的个数
count(vecInt1.begin(), vecInt1.end(), 5);
count_if(vecInt1.begin(), vecInt1.end(), equal1);
//equal
//判断连个或两组元素是否相等
equal(vecInt1.begin(), vecInt1.end(), vecInt2.begin());
equal(vecInt1.begin(), vecInt1.end(), vecInt2.begin(),equal2);
//equal_range
//使用二分法查找有序区间里德满足条件的元素的区间,equal_range可以实现lower_bound upper_bound
equal_range(vecInt1.begin(), vecInt1.end(), 5);
equal_range(vecInt2.begin() + 2, vecInt2.end(), 5, greater<int>());
//lower_bound/upper_bound
//使用二分法查找有序区间的小于的范围或者大于的范围
lower_bound(vecInt1.begin(), vecInt1.end(), 5);
upper_bound(vecInt2.begin(), vecInt2.end(), 5, greater<int>());
//fill/fill_n
//填充数据到数据队列里
fill(vecInt1.begin(), vecInt1.end(), 5);
fill_n(vecInt1.begin(), 6, 5);
//find/find_if
//顺序查找满足条件的元素
find(vecInt1.begin(), vecInt1.end(), 5);
find_if(vecInt1.begin(), vecInt1.end(), equal1);
//find_first_of/find_end
//查找最先或者最后匹配的一组序列
find_first_of(vecInt1.begin(), vecInt1.end(), vecInt2.begin() + 3, vecInt2.begin() + 5);
find_end(vecInt1.begin(), vecInt1.end(), vecInt2.begin() + 3, vecInt2.begin() + 5, equal2);
//for_each
//遍历队列中的每一个元素
for_each(vecInt1.begin(), vecInt1.end(),equal1);
//generate/generate_n
//遍历队列中的每一个或者n个元素,并赋值
generate(vecInt1.begin(),vecInt1.end(),rand());
generate_n(vecInt1.begin(),5,rand());
//includes
//判断一个有序队列里是否包含另一个有序队列
includes(vecInt1.begin,vecInt1.end(), vecInt2.begin(), vecInt2.begin() + 5);
includes(vecInt1.begin,vecInt1.end(), vecInt2.begin(), vecInt2.begin() + 5, equal2);
//inplace_merge
//合并一个中前后两段分别有序的序列,即[first,middle)与[middle,last)分别有序,然后变成一个有序队列
inplace_merge(vecInt1.begin(), vecInt1.begin() + 5, vecInt1.end());
inplace_merge(vecInt1.begin(), vecInt1.begin() + 5, vecInt1.end(), lesser);
//merge
//合并两个有序的队列,默认为 < 比较
merge(vecInt1.begin(), vecInt1.end(), vecInt2.begin(), vecInt2.end(), vecInt3);
merge(vecInt1.begin(), vecInt1.end(), vecInt2.begin(), vecInt2.end(), vecInt3, lesser);
//swap/swap_ranges/iter_swap
//交换/交换两个区间数/交换迭代器
swap(i, j);
swap_ranges(vecInt1.begin(), vecInt1.end(), vecInt2.begin() + 5);
vector<int>::iterator iter1 = vecInt1.begin();
vector<int>::iterator iter2 = vecInt1.end();
iter_swap(iter1, iter2);
//lexicographical_compare
//逻辑比较, 小于true 否则false,元素多少也会影响结果,队列1小于队列2返回true,否则false
lexicographical_compare(vecInt1.begin(), vecInt1.end(), vecInt2.begin(), vecInt2.end());
lexicographical_compare(vecInt1.begin(), vecInt1.end(), vecInt2.begin(), vecInt2.end(),lesser);
//make_heap/push_heap/pop_heap/sort_heap
//std::make_heap将[start, end)范围进行堆排序,默认使用less<int>, 即最大元素放在第一个。
//std::pop_heap将front(即第一个最大元素)移动到end的前部,同时将剩下的元素重新构造成(堆排序)一个新的heap。
//std::push_heap对刚插入的(尾部)元素做堆排序。
//std::sort_heap将一个堆做排序,最终成为一个有序的系列,可以看到sort_heap时,必须先是一个堆(两个特性:1、最大元素在第一个 2、添加或者删除元素以对数时间),因此必须先做一次make_heap.
make_heap(vecInt1.begin(), vecInt1.end());
push_heap(vecInt1.begin(), vecInt1.end());
pop_heap(vecInt1.begin(), vecInt1.end());
sort_heap(vecInt1.begin(), vecInt1.end());
//min/max
//最大值/最小值
min(1, 2);
max(3, 6);
//min_element/max_element
//找到最大和最小的元素
min_element(vecInt1.begin(), vecInt1.end());
max_element(vecInt1.begin(), vecInt1.end(), lesser);
//mismatch
//找到两组队列中第一个不匹配的位置,存在pair中
mismatch(vecInt1.begin(), vecInt1.end(), vecInt2.begin());
mismatch(vecInt1.begin(), vecInt1.end(), vecInt2.begin(), equal2);
//prev_permutation/next_permutation
//找到一个队列按着某个条件的前一个或者后一个队列,可以统计一组数据的的全排列
prev_permutation(vecInt1.begin(), vecInt1.end());
prev_permutation(vecInt1.begin(), vecInt1.end(), lesser);
next_permutation(vecInt1.begin(), vecInt1.end());
//nth_element
//使第n大[某种意义的大]元素处于第n位置,并且比这个元素小的元素都排在这个元素之前,比这个元素大的元素都排在这个元素之后,但不能保证他们是有序的
nth_element(vecInt1.begin(), vecInt1.begin() + 3, vecInt1.end());
nth_element(vecInt1.begin(), vecInt1.begin() + 3, vecInt1.end(), lesser);
//sort/stable_sort/partial_sort/partial_sort_copy
//排序/稳定排序/部分排序/部分排序并拷贝
sort(vecInt1.begin(), vecInt1.end());
stable_sort(vecInt1.begin(), vecInt1.end());
partial_sort(vecInt1.begin(), vecInt1.begin() + 5, vecInt1.end(), lesser);
partial_sort_copy(vecInt1.begin(), vecInt1.begin() + 5, vecInt2.begin() + 5, vecInt2.begin() + 10);
//partition/stable_partition
//分段/稳定分段,将数据分成满足条件的两段
partition(vecInt1.begin(),vecInt1.end(),bind2nd(less<int>(),5));
stable_partition(vecInt1.begin(),vecInt1.end(),bind2nd(less<int>(),5));
//random_shuffle
//随机洗牌,将数列里的元素排列打乱
random_shuffle(vecInt1.begin(), vecInt1.end());
//rand1返回随机一个交换位置,要确保每个位置都随机一次,否则就会丢失原始队列数据
random_shuffle(vecInt1.begin(), vecInt1.end(), rand1);
//remove/remove_if
//删除满足条件的元素
remove(vecInt1.begin(), vecInt1.end(), 5);
remove_if(vecInt1.begin(), vecInt1.end(), equal1);
//remove_copy/remove_copy_if
//将满足条件的元素排除在外,其他元素拷贝到目的数据区,不改变源数据,目的数据区必须能容纳下源数据
remove_copy(vecInt1.begin(), vecInt1.end(), vecInt2, 5);
remove_copy_if(vecInt1.begin(), vecInt1.end(), vecInt2, equal1);
//replace/replace_if
//替换满足条件的元素
replace(vecInt1.begin(), vecInt1.end(), 5, 7);
replace_if(vecInt1.begin(), vecInt1.end(), equal1, 7);
//replace_copy/replace_copy_if
//将满足条件的元素替换掉,并拷贝到目的数据区,不改变源数据,目的数据区必须能容纳下源数据
replace_copy(vecInt1.begin(), vecInt1.end(), vecInt2.begin(), 5, 7);
replace_copy_if(vecInt1.begin(), vecInt1.end(), vecInt2.begin(), equal1, 7);
//reverse/reverse_copy
//反转队列元素/拷贝反转队列元素到目的数据,不改变源数据,目的数据区必须能容纳下源数据
reverse(vecInt1.begin(),vecInt1.end());
reverse_copy(vecInt1.begin(), vecInt1.end(), vecInt2.begin());
//rotate/rotate_copy
//旋转【实际应该叫交换】两段区间的元素/旋转【实际应该叫交换】两段区间的元素到目的数据,不改变源数据,目的数据区必须能容纳下源数据
rotate(vecInt1.begin(), vecInt1.begin() + 3, vecInt1.end());
rotate_copy(vecInt1.begin(), vecInt1.begin() + 3, vecInt1.end(), vecInt2.begin());
//search/search_n
//搜索一个队列里是否存在另一个子队列,返回第一个匹配位置
search(vecInt1.begin(), vecInt1.end(), vecInt2.begin(), vecInt2.begin() + 3);
search(vecInt1.begin(), vecInt1.end(), vecInt2.begin(), vecInt2.begin() + 3, equal2);
//搜索是否含有3个5
search_n(vecInt1.begin(), vecInt1.end(), 3, 5);
search_n(vecInt1.begin(), vecInt1.end(), 3, 5, equal2);
//set_difference
//合并两个有序队列里的不相交部分组成一个新的队列,新队列必须能容纳下所有数据,并且不会有重复元素
set_difference(vecInt1.begin(), vecInt1.end(), vecInt2.begin(), vecInt2.end(), vecInt3.begin());
//set_intersection
//合并两个有序队列里的相交部分组成一个新的队列,新队列必须能容纳下所有数据,并且不会有重复元素
set_intersection(vecInt1.begin(), vecInt1.end(), vecInt2.begin(), vecInt2.end(), vecInt3.begin());
//set_symmetric_difference
//合并两个有序队列里的异或部分组成一个新的队列,新队列必须能容纳下所有数据,并且不会有重复元素
set_symmetric_difference(vecInt1.begin(), vecInt1.end(), vecInt2.begin(), vecInt2.end(), vecInt3.begin());
//set_union
//合并两个有序队列里的或部分组成一个新的队列,新队列必须能容纳下所有数据,并且不会有重复元素
set_union(vecInt1.begin(), vecInt1.end(), vecInt2.begin(), vecInt2.end(), vecInt3.begin());
//transform
//使用一/二元函数转换数据,目的数据区必须能容纳下所有数据
transform(vecInt1.begin(), vecInt1.end(), vecInt1.begin(), to1);
transform(vecInt1.begin(), vecInt1.end(), vecInt2.begin(), vecInt3.begin(), to2);
transform(vecInt1.begin(), vecInt1.end(), vecInt2.begin(), vecInt3.begin(), multiplies<int>());
//unique/unique_copy
//移除相邻重复元素到末尾/去除相邻重复元素并拷贝到新数据区【提取相邻不重复元素】
unique(vecInt1.begin(), vecInt1.begin() + 8);
unique(vecInt1.begin(), vecInt1.begin() + 8,equal2);
unique_copy(vecInt1.begin(), vecInt1.begin() + 8, vecInt1.begin() + 8, equal2);
//注意:
// 1、所有算法的开始和结束,结束不包含在内
// 2、所有需要提前准备足够空间的算法,返回值一般都是新空间的结束位置
// 3、所有返回的区间都是开始有效,结束无效【不包括在内】
// 4、稳定和不稳定算法,是满足条件的两个元素有没有发生交换
// 5、STL算法通常是要和函数对象一起使用,有些看起来比较奇怪,却很简洁有用
}