• c++中的 Stl 算法(很乱别看)


      1 #include <iostream>
      2 #include <vector>
      3 #include <functional>
      4 #include <algorithm>
      5 #include <string>
      6 #include <array>
      7 #include <ctime>
      8 #include <cstdlib>
      9 #include <random>
     10 #include <list>
     11 
     12 
     13 int main()
     14 {
     15     std::vector<int> vec{1, 2, 4, 6, 7, 8};
     16 
     17     //1.简单查找
     18 
     19     //return iterator by value/unaryPred
     20     //查找单值出现位置
     21     std::cout<<*std::find(vec.begin(),vec.end(),2)<<std::endl;
     22     std::cout<<*std::find_if(vec.begin(),vec.end(),[](int& value){return value==9;})<<std::endl;
     23     std::cout<<*std::find_if_not(vec.begin(),vec.end(),[](int& value){return value==1;})<<std::endl;
     24 
     25     //return times by value/unaryPred
     26     std::cout<<std::count(vec.begin(),vec.end(),4)<<std::endl;
     27     std::cout<<std::count_if(vec.begin(),vec.end(),[](int& value){return value==4;})<<std::endl;
     28 
     29 
     30     //return bool by unaryPred;
     31     //对序列元素调用一元谓词
     32     std::cout<<std::boolalpha;
     33     std::cout<<std::all_of(vec.begin(),vec.end(),[](int& value){return typeid(value)==typeid(int&);})<<std::endl;
     34     std::cout<<std::any_of(vec.begin(),vec.end(),[](int& value){return value==4;})<<std::endl;
     35     std::cout<<std::none_of(vec.begin(),vec.end(),[](int& value){return value==20;})<<std::endl;
     36     std::cout<<std::noboolalpha;
     37 
     38 
     39     //2.查找重复值
     40 
     41     //return iterator by NULL/binaryPred
     42     //返回查找第一个相邻重复元素迭代器
     43     std::cout<<*std::adjacent_find(vec.begin(),vec.end())<<std::endl;
     44     std::cout<<*std::adjacent_find(vec.begin()+4,vec.end(),[](int& a,int& b){return a==b;})<<std::endl;
     45 
     46 
     47     //return iterator by binaryPred
     48     //查找某个数是否出现一定次数,返回第一个元素迭代器
     49     std::cout<<*std::search_n(vec.begin(),vec.end(),4,1)<<std::endl;
     50     std::cout<<*std::search_n(vec.begin(),vec.end(),3,4,[](int a,int b){ return a==b;})<<std::endl;
     51 
     52 
     53 
     54     //3.查找子序列方法
     55 
     56     //return iterator by NULL/binaryPred
     57     //从第一个序列中查找第二个序列,返回第二个序列在第一个序列出现的迭代器
     58     std::vector<int> vec_cm{4,4,4,5,6,7};
     59     std::cout<<*std::search(vec.begin(),vec.end(),vec_cm.begin(),vec_cm.end())<<std::endl;
     60     std::cout<<*std::search(vec.begin(),vec.end(),vec_cm.begin(),vec_cm.end(),[](int& a,int& b){return a==b;})<<std::endl;
     61 
     62     //返回一个迭代器指向第二个序列任意元素在第一个序列中出现的位置
     63     std::cout<<*std::find_first_of(vec.begin(),vec.end(),vec_cm.begin(),vec_cm.end())<<std::endl;
     64     std::cout<<*std::find_first_of(vec.begin(),vec.end(),vec_cm.begin(),vec_cm.end(),[](int& a,int& b){return a==b;})<<std::endl;
     65 
     66     //类似search,返回序列的尾部
     67     //std::find_end();
     68 
     69 
     70     //其他只读算法
     71 
     72 
     73     //熟知的std::for_each();
     74     //对序列每个元素指向可调用对象,对返回值忽略
     75     std::for_each(vec.begin(),vec.end(),[](int& value){std::cout<<value<<"	";});
     76     std::cout<<std::endl;
     77 
     78     //比较两序列,返回pair first指向一个不同位置迭代器和second指向第二个相同位置迭代器(~.~)
     79     std::pair<std::vector<int>::iterator,std::vector<int>::iterator> pair1=
     80             std::mismatch(vec.begin(),vec.end(),vec_cm.begin());
     81 //    std::pair<std::vector<int>::iterator,std::vector<int>::iterator> pair2=
     82 //            std::mismatch(vec.begin(),vec.end(),vec_cm.begin(),[](int& a,int& b){});
     83     std::cout<<*pair1.first<<*pair1.second<<std::endl;
     84 
     85 
     86     //判断2序列相等,则返回true
     87     std::cout<<std::boolalpha;
     88     std::cout<<std::equal(vec.begin(),vec.end(),vec_cm.begin())<<std::endl;
     89     std::cout<<std::equal(vec.begin(),vec.end(),vec_cm.begin(),[](int& a,int& b){ return true;})<<std::endl;
     90     std::cout<<std::noboolalpha;
     91 
     92 
     93 
     94     // 二分法搜索
     95     // 这些算法要求前向迭代器,这样花费时间类似线性增长而不是对数增长
     96     // 前提序列有序
     97     // 注意:(有毒)
     98     std::cout << *std::lower_bound(vec.begin(), vec.end(), 3) << std::endl;
     99     std::cout << *std::upper_bound(vec.begin(), vec.end(), 7) << std::endl;
    100 
    101 
    102     //懵- -
    103     auto pair=std::equal_range(vec.begin(),vec.end(),3);
    104     std::cout<<*pair.first<<*pair.second<<std::endl;
    105 
    106     std::cout << std::boolalpha;
    107     std::cout<<std::binary_search(vec.begin(),vec.end(),4)<<std::endl;
    108     std::cout << std::noboolalpha;
    109 
    110 
    111 
    112     //拷贝算法
    113 
    114     std::vector<int> vec3_;
    115     vec3_.resize(vec.size());
    116     //按第一序列范围拷贝;
    117     std::copy(vec.begin(),vec.end(),vec3_.begin());
    118     //按谓词拷贝
    119     std::copy_if(vec.begin(),vec.end(),vec3_.begin(),[](int& value){ return value>2;});
    120     //按数量拷贝,返回尾元素
    121     std::copy_n(vec.begin(),vec.size(),vec.begin());
    122 
    123 
    124 
    125     //对元素调用std::move()移动
    126     std::move(vec.begin(),vec.end(),vec.begin());
    127 
    128 
    129     std::vector<int> vec4_;
    130     vec4_.resize(vec.size());
    131 //    //对第一序列执行一元谓词拷贝到第二序列中
    132 //    std::transform(vec.begin(),vec.end(),vec4_.begin(),[](int& value){return value>0;});
    133 //
    134 //    //对2序列执行二元谓词放入第三序列
    135     std::vector<int> vec5_;
    136 //    vec5_.resize(vec.size()+vec4_.size());
    137 //    std::transform(vec.begin(),vec.end(),vec4_.begin(),vec5_.begin(),[](int& a,int& b){ return a==b;});
    138 
    139 
    140 
    141     //拷贝一个序列到另一个序列,与oldvalue比较相等的则在新序列中替换成新值
    142     std::replace_copy(vec.begin(),vec.end(),vec4_.begin(),2,3);
    143 
    144     //根据一元谓词条件判断那些值需要被替换成新值
    145     std::replace_copy_if(vec.begin(),vec.end(),vec4_.begin(),[](int& value){return value>0;},20);
    146 
    147 
    148     //合并2序列到第三序列
    149     //默认降序,可自行设置二元谓词比较
    150     //前提:有序序列
    151     std::merge(vec.begin(),vec.end(),vec4_.begin(),vec4_.end(),vec5_.begin());
    152     std::merge(vec.begin(),vec.end(),vec4_.begin(),vec4_.end(),vec5_.begin(),[](int& a,int& b){return a<b;});
    153 
    154 
    155     //同类型迭代器之间交换
    156     std::vector<int> vec8_{8,8,8,8};
    157     std::for_each(vec.begin(),vec.end(),[](int& value){std::cout<<value<<"	";});
    158     std::cout<<std::endl;
    159     std::for_each(vec8_.begin(),vec8_.end(),[](int& value){std::cout<<value<<"	";});
    160     std::cout<<std::endl;
    161 
    162 
    163     std::iter_swap(vec.begin(),vec.begin()+2);
    164     std::iter_swap(vec.begin(),vec8_.begin()+2);
    165     std::swap_ranges(vec8_.begin(),vec8_.end(),vec.begin());
    166 
    167     std::for_each(vec.begin(),vec.end(),[](int& value){std::cout<<value<<"	";});
    168     std::cout<<std::endl;
    169     std::for_each(vec8_.begin(),vec8_.end(),[](int& value){std::cout<<value<<"	";});
    170     std::cout<<std::endl;
    171 
    172 
    173     //单序列操作replace/replace_if 区别 replace_copy/replace_copy_if
    174     //值对比或者unaryPred查找;
    175     std::vector<int> vec9_{1,2,3,4,5,6,7};
    176 
    177     std::replace(vec9_.begin(),vec9_.end(),3,100);
    178     std::cout<<vec9_[2]<<std::endl;
    179     std::replace_if(vec9_.begin(),vec9_.end(),[](int& value){return value%2==0;},100);
    180 
    181     std::for_each(vec9_.begin(),vec9_.end(),[](int &value){std::cout<<value<<"	";});
    182     std::cout<<std::endl;
    183 
    184 
    185 
    186 
    187 
    188 
    189 
    190     //划分算法
    191     std::vector<int> sort_vec{1,2,3,4,5,6,7,8,9};
    192 
    193     for(auto& iter:sort_vec)std::cout<<iter<<"	";
    194     //是否符合划分谓词条件,true在前false在后
    195     if(std::is_partitioned(sort_vec.begin(),sort_vec.end(),[](int& value){return value%2==1;}))
    196     {
    197         std::cout<<"(Partition)"<<std::endl;
    198     }else
    199     {
    200         std::cout<<"(No partition)"<<std::endl;
    201     }
    202 
    203     //划分操作,返回谓词为true队列的后一位迭代器;全是false的话返回beg;
    204     std::partition(sort_vec.begin(),sort_vec.end(),[](int& value){ return value%2==1;});
    205     //std::partition_point(...)  返回partition的迭代器- -(好鸡肋);
    206 
    207     for(auto& iter:sort_vec)std::cout<<iter<<"	";
    208     if(std::is_partitioned(sort_vec.begin(),sort_vec.end(),[](int& value){return value%2==1;}))
    209     {
    210         std::cout<<"(Partition)"<<std::endl;
    211     }else
    212     {
    213         std::cout<<"(No partition)"<<std::endl;
    214     }
    215 
    216 
    217 
    218     //从一个序列中划分出符合谓词条件的2部分(true/false);
    219     std::array<int,18> sort_array1,sort_array2;
    220     std::partition_copy(sort_vec.begin(),sort_vec.end(),sort_array1.begin(),sort_array2.begin(),[](int& value){return value%2==0;});
    221 
    222     for(auto& iter:sort_array1)std::cout<<iter<<"	";
    223     std::cout<<std::endl;
    224     for(auto& iter:sort_array2)std::cout<<iter<<"	";
    225 
    226 
    227 
    228 
    229 
    230    // 正常排序
    231 
    232     std::array<int,20> sort_array{1,2,3,4,5,6,324,34,13,213,31,32};
    233     //排序算法
    234     //std::stable_sort 稳定排序
    235     std::sort(sort_array.begin(),sort_array.end());
    236     //std::sort(sort_array.begin(),sort_array.end(),[](int& a,int& b){return a>=b;});
    237 
    238 
    239     if(std::is_sorted(sort_array.begin(),sort_array.end()))
    240     {
    241         std::cout<<"sort"<<std::endl;
    242     }else
    243     {
    244         std::cout<<"not sort"<<std::endl;
    245     }
    246 
    247 
    248 
    249     //快速排序
    250     std::array<int,12> sort_array{1,2,3,4,5,6,324,34,13,213,31,32};
    251 
    252     std::nth_element(sort_array.begin(),sort_array.begin()+4,sort_array.end());
    253 
    254     for(auto& iter:sort_array)std::cout<<iter<<"	";
    255 
    256 
    257 
    258 
    259 
    260 
    261     //重排序列算法
    262 
    263     std::array<int,12> sort_array{1,2,3,4,5,6,324,34,13,213,31,32};
    264     //删除符合条件的,用保留的元素覆盖删除元素
    265     std::remove(sort_array.begin(),sort_array.end(),213);
    266     std::remove_if(sort_array.begin(),sort_array.end(),[](int& value){return value%2==0;});
    267     //std::remove_copy(sort_array.begin(),sort_array.end(),dest,value);
    268     //std::remove_copy_if(sort_array.begin(),sort_array.end(),dest,comp);
    269 
    270     //序列相邻重复元素删除,通过覆盖删除
    271     //std::unique(beg,end);
    272     //std::unique(beg,end,binaryPred);
    273     //std::unique_copy(beg,end,dest)
    274     //std::unique_copy_if(beg,end,dest,binaryPred);
    275 
    276     for(auto& iter:sort_array)std::cout<<iter<<"	";
    277 
    278 
    279 
    280     //截取序列,从某个元素到end之间的范围 截取到beg之前
    281     std::vector<int>  vec18{1,2,3,4,5,6,7,8,9};
    282 
    283     std::rotate(vec18.begin(),vec18.begin()+3,vec18.end());
    284     //std::rotate_copy(beg,mid,end,dest);
    285 
    286     for(auto& iter:vec18)std::cout<<iter<<"	";
    287 
    288 
    289     //翻转序列
    290     //std::reverse(beg,end);
    291     //std::reverse(beg,end,dest);
    292 
    293 
    294 
    295 
    296 
    297     //随机序列
    298     std::vector<int> random_vec{1, 2, 3, 4, 5, 6, 7, 8};
    299 
    300     unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
    301     // std::random_shuffle(random_vec.begin(),random_vec.end());
    302     //std::random_shuffle(random_vec.begin(),random_vec.end(),[](int seed){return std::rand()%seed;});
    303     std::shuffle(random_vec.begin(), random_vec.end(), std::default_random_engine(seed));
    304 
    305     for (auto &iter:random_vec)std::cout << iter << "	";
    306 
    307 
    308 
    309     //排列算法
    310 
    311     std::vector<int> vec1{1, 2, 3, 4, 5, 6};
    312     std::vector<int> vec2{1, 3, 4, 5, 2, 6};
    313 
    314     //2序列是否是1序列的排列,是返回true;
    315     //可以添加bianryPred选择排列方式
    316     if (std::is_permutation(vec1.begin(), vec1.end(), vec2.begin()))
    317         std::cout << "vec2 is_permutation belong vec1" << std::endl;
    318 
    319 
    320     //1 2 3
    321     //1 3 2
    322     //2 1 3
    323     //2 3 1
    324     //3 1 2
    325     //3 2 1
    326     //根据字典序列排序,默认降序排序,比如(1 2 3) ,首元素排列中1最小且第二个元素2小于排列(1 3 2),所以排列(1 2 3)在第一个,其他依次类推;
    327     std::vector<int> vec_permutation{2,3,1};
    328     do
    329     {
    330         std::cout<<vec_permutation[0]<<" "<<vec_permutation[1]<<" "<<vec_permutation[2]<<std::endl;
    331 
    332         //可以添加bianryPred选择排列方式
    333         //std::pre_permutation为序列反向
    334     }while(std::next_permutation(vec_permutation.begin(),vec_permutation.end()));
    335 
    336     //最后容器元素被置为靠头第一个排列
    337 
    338 
    339     //字典序列比较
    340     std::lexicographical_compare(beg,end,beg2,end2);
    341     std::lexicographical_compare(beg,end,beg2,end2,comp);
    342 
    343 
    344 
    345 
    346     //容器1是否包含在容器2的元素
    347     int container[] = {5,10,15,20,25,30,35,40,45,50};
    348     int continent[] = {40,30,20,10};
    349 
    350     std::sort (container,container+10);
    351     std::sort (continent,continent+4);
    352 
    353     // using default comparison:
    354     if ( std::includes(container,container+10,continent,continent+4) )
    355         std::cout << "container includes continent!
    ";
    356 
    357     // using myfunction as comp:
    358     if ( std::includes(container,container+10,continent,continent+4, [](int& a,int& b){ return a<b; }) )
    359         std::cout << "container includes continent!
    ";
    360 
    361 
    362     std::set_union 把2有序的序列合并成一个有序序列到第三个容器中
    363     int first[] = {5,10,15,20,25};
    364     int second[] = {50,40,30,20,10};
    365     std::vector<int> v(10);                      // 0  0  0  0  0  0  0  0  0  0
    366     std::vector<int>::iterator it;
    367 
    368     std::sort (first,first+5);     //  5 10 15 20 25
    369     std::sort (second,second+5);   // 10 20 30 40 50
    370 
    371     it=std::set_union (first, first+5, second, second+5, v.begin());
    372     // 5 10 15 20 25 30 40 50  0  0
    373     v.resize(it-v.begin());                      // 5 10 15 20 25 30 40 50
    374 
    375     std::cout << "The union has " << (v.size()) << " elements:
    ";
    376     for (it=v.begin(); it!=v.end(); ++it)
    377         std::cout << ' ' << *it;
    378     std::cout << '
    ';
    379 
    380 
    381 
    382     std::vector<int> int_vec1{1,2,3,4,5,6,7,8,9};
    383     std::vector<int> int_vec2{3,4,5};
    384     std::vector<int> int_vec;
    385     int_vec.resize(3);
    386     //寻找交集
    387     std::set_intersection(int_vec1.begin(),int_vec1.end(),int_vec2.begin(),int_vec2.end(),int_vec.begin());
    388     for(auto& iter:int_vec)std::cout<<iter<<std::endl;
    389 
    390 
    391     出现在第一个序列,但不出现在第二个序列
    392 
    393     std::vector<int> int_vec1{1, 2, 3, 4, 5, 6, 7, 8, 9};
    394     std::vector<int> int_vec2{3, 4, 5};
    395     std::vector<int> int_vec(6);
    396 
    397     std::set_difference(int_vec1.begin(),int_vec1.end(),int_vec2.begin(),int_vec2.end(),int_vec.begin());
    398 
    399     for(auto& iter:int_vec)std::cout<<iter<<std::endl;
    400 
    401 
    402     //非交集区域
    403 
    404     std::vector<int> int_vec1{1, 2, 3, 4, 5, 6, 7, 8, 9};
    405     std::vector<int> int_vec2{3, 4, 5};
    406     std::vector<int> int_vec(12);
    407 
    408     auto end=std::set_symmetric_difference(int_vec1.begin(),int_vec1.end(),int_vec2.begin(),int_vec2.end(),int_vec.begin());
    409     int_vec.resize(end-int_vec.begin());
    410 
    411 
    412     for(auto& iter:int_vec)std::cout<<iter<<std::endl;
    413 
    414 
    415     //前两个应用值比较或者初始化链表值比较
    416 
    417     std::initializer_list<int> li{1,2,3,4,5,6,7,8};
    418 
    419     std::cout<<std::max(1,2)<<std::endl;
    420     std::cout<<std::min(1,2)<<std::endl;
    421     std::cout<<std::min(li)<<std::endl;
    422     std::cout<<std::max(li)<<std::endl;
    423     auto pair=std::minmax(li);
    424     std::cout<<pair.first<<" "<<pair.second<<std::endl;
    425 
    426     std::vector<int> in_vec{1,23,4,5,6,7,8};
    427 
    428     std::cout<<*std::min_element(in_vec.begin(),in_vec.end())<<std::endl;
    429     std::cout<<*std::max_element(in_vec.begin(),in_vec.end())<<std::endl;
    430     auto pair_=std::minmax_element(in_vec.begin(),in_vec.end());
    431     std::cout<<*pair_.first<<" "<<*pair_.second<<std::endl;
    432 
    433 
    434 
    435 
    436     //数值算法
    437 
    438     //容器累和,sum代表初值
    439     int array[]={1,2,3,4,5,6,7};
    440     int sum=0;
    441     std::cout<<std::accumulate(array,array+7,sum)<<std::endl;
    442     std::cout<<std::accumulate(array,array+7,sum,[](int& a,int& b){ return a+b;})<<std::endl;
    443     std::cout<<sum<<std::endl;
    444 
    445 
    446 
    447     //容器元素对应想乘求和
    448     int myaccumulator (int x, int y) {return x-y;}
    449     int myproduct (int x, int y) {return x+y;}
    450 
    451     int init = 100;
    452     int series1[] = {10,20,30};
    453     int series2[] = {1,2,3};
    454 
    455     std::cout << "using default inner_product: ";
    456     std::cout << std::inner_product(series1,series1+3,series2,init);
    457     std::cout << '
    ';
    458 
    459     std::cout << "using functional operations: ";
    460     std::cout << std::inner_product(series1,series1+3,series2,init,
    461                                     std::minus<int>(),std::divides<int>());
    462     std::cout << '
    ';
    463 
    464     std::cout << "using custom functions: ";
    465     std::cout << std::inner_product(series1,series1+3,series2,init,
    466                                     myaccumulator,myproduct);
    467     std::cout << '
    ';
    468 
    469 
    470 
    471     //序列当前位置到beg范围求和.当前位置递增
    472     int array[]={1,2,3,4,5,6,7};
    473     int result[7]{0};
    474     std::partial_sum(array,array+7,result);
    475     for(auto& iter:result)std::cout<<iter<<"	";
    476     std::cout<<std::endl;
    477 
    478 
    479 
    480     //当前位置减去前一个元素
    481     int array[] = {1, 2, 3, 4, 5, 6, 7};
    482     int result[7]{0};
    483     std::adjacent_difference(array, array + 7, result);
    484     for (auto &iter:result)std::cout << iter << "	";
    485     std::cout << std::endl;
    486 
    487 
    488     //填充容器给定数值递增
    489     int array[7];
    490     std::iota(array,array+7,10);
    491     for(auto& iter:array)std::cout<<iter<<"	";
    492     std::cout<<std::endl;
    493 
    494 
    495     return 0;
    496 }
  • 相关阅读:
    Kubernetes学习之路(21)之网络模型和网络策略
    Kubernetes学习之路(16)之存储卷
    Kubernetes学习之路(18)之statefulset控制器
    Kubernetes学习之路(28)之镜像仓库Harbor部署
    Kubernetes学习之路(六)之创建K8S应用
    Kubernetes学习之路(十五)之Ingress和Ingress Controller
    nali一款linux下显示IP来源的小工具
    Redis 及RedisBloom 安装
    对java注解与反射的理解
    Java 8 stream的详细用法
  • 原文地址:https://www.cnblogs.com/xuaidongstdudyrecording/p/7255916.html
Copyright © 2020-2023  润新知