当前位置: 首页 > article >正文

C++:STL常用算法随笔

主要的头文件#include <algorithm>  < functional>  <numeric>

遍历算法:

for_each、transform(搬运容器到另一个容器中 )

void print1(int val)
{
    cout << val <<" ";
}
for_each (v.begin(),v.end() , print1)

或者用仿函数的形式遍历:

class print2{
public:
    void operator()(int val)
    {
        cou <<val <<" ";
    }
}

for_each(v.begin(),v.end(),print2()) ;  不同于上述,此处需要传入匿名函数对象


对于transform搬运算法:

vector <int> vtarget;   //创建目标容器

vtarget.resize(v.size()) ; //目标容器必须提前开辟空间,与原vector一致,否则无法搬运

class trans1{
public :
    int operator () (int val )
    {
        return val;    
    }
}

transform (v.begin();v.end();vtarget.begin(),trans1());  //最后需要加个仿函数 ,注意中间的vtarget.begin()迭代器

查找算法:

find         //查找元素  ,找到返回指定元素的迭代器,找不到返回结束迭代器end();

                利用find可以在容器中找指定的元素,返回值是迭代器,使用迭代器接收
find_if        //按条件查找元素 ,三个参数:开始迭代器、结束迭代器、谓词(返回bool的仿函数)

vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());
if (it ==v.end()) {...}  //没找到
else{} ;  //找到了

对于查找自定义数据类型:

class Person{

public:
    person(string name ,int age){

    this->m_Name = name;
    this->m_Age = age;
}
public:
    string m_Name;
    int m_Age ;
};

class Greater{
    bool operator()(Person &p){
    return p.m_Age >20;    
}
}

 
vector <Person>::iterator it  = find_if (v.begin() , v.end() , Greater());
if(it == v.end()){};
else {};

adjacent_find        //查找相邻重复元素,返回相邻重复元素的第一个元素迭代器

vector<int>::iterator pos = adjacent_find(v.begin(), v.end());


binary_search        //二查找法,查找指定元素是否存在,但是只能在有序数组中使用,返回一个bool类型,速度快,logN时间复杂度
bool ret =binary_search(v.begin(),v.end(),9 ) //查找容器中是否有9元素,但是只能是升序,降序需要提供重载版本

  //升序
    vector<int> v;
    for (int i = 0; i < 10; i++) {
        v.push_back(i);
            }
    bool ret = binary_search(v.begin(), v.end(), 8);
    if (ret == true) {
        cout << "true" << endl;
    }
    else {
        cout << "false" << endl;
    }

    //测试降序是否适用
    vector<int> v1;
    for (int i = 10; i > 0; i--) {
        v1.push_back(i);
    }
    bool ret2 = binary_search(v1.begin(), v1.end(), 8);
    if (ret2 == true) {
        cout << "true" << endl;
    }
    else {
        cout << "false" << endl;
    }

//结果输出:
true
false


count        //统计元素个数,返回一个int整形。

int num=count(v.begin(),v.end(),40);
count_if        //按条件统计元素个数

int num = count_if (v.begin(),v.end(),Greater())  ; 最后一个参数为谓词

或者自定义数据类型:

 排序算法:

sort(v.begin(),v.end()); //升序排列,降序需要添加<functional>中的模板

void myPrint(int val)

{cout << val <<" ";}

sort(v.begin(),v.end(),greater<int>());

for_each (v.begin(),v.end(),myPrint);

打乱算法:random_shuffle

srand((unsigned int) time (NULL));   // 使用时间作为随机数种子来确保真正的随机

random_shuffle(v.begin(),v.end());

合并算法:merge(前提两个容器必须有序,合并之后的也是有序的)

//目标容器
vector<int>vTarget;

vTarget.resize(v1.size()+v2.size()); // 前提必须要给目标容器分配内存!!!
merge(v1.begin(),v1.end(),v2.begin(),v2.end(),vTarget.begin());

数据反转:reverse

reverse(v.begin,v.end());

拷贝和替换算法:

vector <int> v2;

v2.resize(v1.size());  //注意记得先开辟空间!

copy(v1.begin(),v1.end(),v2.begin());

替换算法:replace 

replace(v1.begin(),v1.end() ,20  , 2000) ; // 把所有的20替换为2000

按照条件替换:replace_if

一般构建仿谓词来作为参数

构建谓词(把大于等于30 的数替换)

class Greater30

{

public :
        bool operator() (int val )

        {

                return val>=30;

        }

}

replace_if (v1.begin() , v1. end() , Greater30() ,30000) ; 把大于等于30的数替换为30000;

常用算数生成算法:#include <numeric>

accumulate   // 计算容器元素累计总和,可以设置起始值
fill // 向容器中添加元素,填充所有空间为指定的值

int sum = accumulate(v.begin() , v.end() , value);  //value 表示起始的累加值

常用的集合算法: (此处的集合并不指set容器,而是数学概念)

求交集: set_ intersection    (原容器必须是有序序列)

vector <int> vtarget;

vtarget.resize(min(v1.size(),v2.size())) ;  //这样做是考虑到最大的目标容器内存情况:原容器1包含原容器2

vector<int>::interator itEnd=set_ intersection(v1.begin(),v1.end(),v2.begin(),v2.end(),vtarget.begin());  //返回迭代器,指向新的vtarget的最后
打印输出:
for_each (vTarget.begin(),itEnd , myprint());

求并集 : set_union(原容器必须是有序序列)

vtarget.resize(v1.size()+v2.size()) ;  //这样做是考虑到最大的目标容器内存情况:原容器1与原容器2无交集

vector<int>::interator itEnd=set_ union(v1.begin(),v1.end(),v2.begin(),v2.end(),vtarget.begin());  //返回迭代器,指向新的vtarget的最后

打印输出:
for_each (vTarget.begin(),itEnd , myprint());

求差集 : set _difference


http://www.kler.cn/news/333590.html

相关文章:

  • Prometheus之Pushgateway使用
  • 静态路由故障排查
  • python中的copy方法
  • 为什么MySQL不建议使用delete删除数据
  • 基于springboot vue 电影推荐系统
  • 掌握 C# 多线程与异步编程
  • 408笔记|随笔记录|自用|2
  • (Linux驱动学习 - 6).Linux中断
  • JDK——java.util.function
  • [Python学习日记-39] 闭包是个什么东西?
  • 【2023工业3D异常检测文献】PointCore: 基于局部-全局特征的高效无监督点云异常检测器
  • javascript-obfuscator js混肴 (用户界面版)
  • 【ECMAScript 从入门到进阶教程】第四部分:项目实践(项目结构与管理,单元测试,最佳实践与开发规范,附录)
  • [SQL] SQL语句注意事项
  • Python——异常处理机制
  • AJAX 1——axios体验、认识URL、常用请求方法、HTTP协议、错误处理、form-serialize插件
  • 用Python实现运筹学——Day 12: 线性规划在物流优化中的应用
  • 【Qt】控件概述 (1)—— Widget属性
  • 胤娲科技:AI透视艺术大师——拉斐尔的笔触,500年后终被AI读懂
  • [C++][第三方库][Elasticsearch]详细讲解