STL复杂算法

来源:互联网 发布:粮油统计网络直报系统 编辑:程序博客网 时间:2024/05/16 09:11

STL复杂算法浅谈

<span style="font-size:18px;">//复杂算法#include<functional>#include<algorithm>#include<iterator>#include<string>#include<vector>#include<iostream>using namespace std;#define N_COUNT 6/*以下函数 最后都默认使用operator<进行比较 自己也可以提供仿函数 都应用于有序区间lower_bound(f,l,val);返回小于val区间的下一个位置 迭代器 upper_bound(f,l,val);//返回 大于val的第一个位置迭代器bool binary_search(f,l,val);//二分法搜索 判断 值是否存在pair<iteator,iterator> equal_range(f,l,val)返回的一对迭代器 为插入该值(递增或者递减)的范围 极端情况 都为begin() 或者都为end()next_permutation 下一个排列prev_permutation 上一个排列random_shuffle 随机重排函数上述三个函数 实现很巧妙 有时间就实现一遍*/template<class T>void Display(const vector<T>& vec){copy(vec.begin(), vec.end(), ostream_iterator<T>(cout, "    "));puts("");}int main(void){int a[] = {0,1,2,3,4,5,6,7,8,9};int len = sizeof(a) / sizeof(a[0]);vector<int>vec(a,a+len);typedef vector<int>::iterator V_ITE;V_ITE ite = vec.end();pair<V_ITE, V_ITE> Pair = equal_range(vec.begin(),vec.end(),-1);if (ite != Pair.first){cout << "first:" << *Pair.first << endl;}if (ite != Pair.second){cout << "second:" << *Pair.second << endl;}//排列算法 /*STL 提供两个求排列的 函数 next_permutation 和 prev_permutation那么什么事上一个 和下一个排列呢?排列组合会做 字典排序 比如abc下一个排列为acbabc没有上一个排列 而  cba没有下一个排列*/string StrArra[] = {"zhang","li","li"};vector<string> Svec(StrArra,StrArra+sizeof(StrArra)/ sizeof(StrArra[0]));Display<string>(Svec);puts("---------------------------");for (size_t i = 0; i < N_COUNT; ++i){if (next_permutation(Svec.begin(), Svec.end())){printf("The %d is  :", i);Display<string>(Svec);}}//通过排列的个数 控制函数调用次数是不可靠的 //因为可鞥没有下一个 序列 或者区间有相同的元素出现 /*The 1 is  :li    zhang    liThe 2 is  :zhang    li    liThe 4 is  :li    zhang    liThe 5 is  :zhang    li    li*/sort(Svec.begin(),Svec.end());puts("-------------------------");for (size_t i = 0; i < N_COUNT; ++i){if (next_permutation(Svec.begin(), Svec.end())){printf("The %d is  :", i);Display<string>(Svec);}}//排序一下也没什么用  如果区间元素不重复出现那么//(先排序)可以通过 N!的循环次数  来得到排列结果/*The 0 is  :li    zhang    liThe 1 is  :zhang    li    liThe 3 is  :li    zhang    liThe 4 is  :zhang    li    li*///随机重排函数 类似于洗牌算法 可以提供自己的随机数函数random_shuffle(vec.begin(), vec.end());Display<int>(vec);return 0;}</span>


0 0