STL算法总结

 

//一下代码都是演示使用,没有具体测试,使用时请查阅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算法通常是要和函数对象一起使用,有些看起来比较奇怪,却很简洁有用
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值