STL 常用算法

C++ STL常用算法 学习总结 end1 容器1结束迭代器 beg2 容器2开始迭代器 end2 容器2结束迭代器 dest 目标容器开始迭代器。beg1 容器1开始迭代器,end1 容器1结束迭代器,beg2 容器2开始迭代器,end2 容器2结束迭代器。beg 开始迭代器,end 结束迭代器,oldvalue 旧元素,newvalue 新元素。beg 开始迭代器,end 结束迭代器,_Pred 谓词,newvalue 替换的新元素。查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end() 阅读详情

1.      STL 常用算法

l  for_each()

例1

//普通函数

voidFuncShowElemt2(int &t)

{

cout << t << " ";

}

 

    vector<int> v1;

    v1.push_back(1);

    v1.push_back(3);

    v1.push_back(5);

 

//通过回调函数  谁使用for_each 谁去填写回调函数的入口地址

for_each(v1.begin(), v1.end(), FuncShowElemt2);

 

例2

typedef struct_Mystruct

{

    inta;

    intb;

}Mystruct;

 

void CallMyMethod(std::pair<const int,Mystruct>& pair)

{

    cout<<pair.first<<endl;

    cout<<pair.second.a<<endl;

    cout<<pair.second.b<<endl;

}

int main()

{

    map<int,Mystruct>mapTest;

    for_each(Map.begin(), Map.end(),CallMyMethod);

    return0;

}

l  find_if

例1

bool IsOdd (int i) {

  return((i%2)==1);

}

 

int main () {

 std::vector<int> myvector;

 

 myvector.push_back(10);

 myvector.push_back(25);

 myvector.push_back(40);

 myvector.push_back(55);

 

 std::vector<int>::iterator it = std::find_if (myvector.begin(),myvector.end(), IsOdd);

  std::cout<< "The first odd value is " << *it << '\n';

  return 0;

}

 

例2

#include <string>

#include <algorithm>

class map_value_finder

{

public:

      map_value_finder(const std::string&cmp_string):m_s_cmp_string(cmp_string){}

       booloperator ()(const std::map<int, std::string>::value_type &pair)

       {

            returnpair.second == m_s_cmp_string;

       }

private:

        conststd::string &m_s_cmp_string;                   

};

int main()

{

   std::map<int, std::string> my_map;

   my_map.insert(std::make_pair(10, "china"));

   my_map.insert(std::make_pair(20, "usa"));

   my_map.insert(std::make_pair(30, "english"));

    my_map.insert(std::make_pair(40,"hongkong"));   

   

   std::map<int, std::string>::iterator it = my_map.end();

    it =std::find_if(my_map.begin(), my_map.end(),map_value_finder("English"));

    if (it ==my_map.end())

      printf("not found\n");       

    else

      printf("found key:%d value:%s\n", it->first,it->second.c_str());

      

    return 0;       

}

l  sort

例1.

bool Compare(const int &a, const int &b)

{

    returna < b; //从小到大

}

 

//普通函数

void printElement(int &t)

{

    cout << t << " ";

}

 

void testSort()

{

    vector<int> v1(10);

 

    for(int i=0; i<10; i++)

    {

        inttmp = rand() %100;

        v1[i] = tmp;

    }

 

    for(vector<int>::iterator it=v1.begin();it!=v1.end(); it++ )

    {

        cout << *it <<" ";

    }

    cout << endl;

    for_each(v1.begin(), v1.end(), printElement);

    cout << endl;

 

    sort(v1.begin(), v1.end(),Compare);

    for_each(v1.begin(), v1.end(),printElement);

    cout << endl;

}

例2

1.      将map中的key和value分别存放在一个pair类型的vector中,然后利用vector的sort函数排序,其中map_verb存放我的map值:

2.       再新建一个map结构,然后把已知的map值得key和value分别作为新map的value和key,这样map结构就会自动按照value值排序啦~~

l  Transform

例1

//二元函数对象

template <typename T>

class SumAdd

{

public:

    T operator()(Tt1, T t2)

    {

        return t1 +t2;

    }

};

    //v1 v2 ==>v3

    vector<int>v1, v2;

    vector<int>v3;

    v1.push_back(1);

    v1.push_back(3);

    v1.push_back(5);

 

    v2.push_back(2);

    v2.push_back(4);

    v2.push_back(6);

 

    v3.resize(10);

transform(v1.begin(), v1.end(), v2.begin(), v3.begin(),SumAdd<int>() );

 

    for(vector<int>::iterator it=v3.begin(); it!=v3.end(); it++ )

    {

        cout<< *it << " ";

    }

    cout <<endl;

 

例2:

 

l  Find

例1

int main () {

  // usingstd::find with array and pointer:

  int myints[] = {10, 20, 30, 40 };

  int * p;

 

  p = std::find(myints, myints+4, 30);

  if (p !=myints+4)

    std::cout<< "Element found in myints: " << *p << '\n';

  else

    std::cout<< "Element not found in myints\n";

 

  // usingstd::find with vector and iterator:

 std::vector<int> myvector (myints,myints+4);

 std::vector<int>::iterator it;

 

  it = find(myvector.begin(), myvector.end(), 30);

  if (it !=myvector.end())

    std::cout<< "Element found in myvector: " << *it << '\n';

  else

    std::cout<< "Element not found in myvector\n";

 

  return 0;

}

例2

l  adjacent_find

在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的迭代器。否则返回past-the-end。

bool myfunction (int i, int j) {

  return (i==j);

}

 

int main () {

  int myints[] ={5,20,5,30,30,20,10,10,20};

 std::vector<int> myvector (myints,myints+8);

 std::vector<int>::iterator it;

 

  // using defaultcomparison:

  it =std::adjacent_find (myvector.begin(), myvector.end());

 

  if(it!=myvector.end())

    std::cout<< "the first pair of repeated elements are: " << *it<< '\n';

 

  //using predicatecomparison:

  it =std::adjacent_find (++it, myvector.end(), myfunction);

 

  if(it!=myvector.end())

    std::cout<< "the second pair of repeated elements are: " << *it<< '\n';

 

  return 0;

}

l  random_shuffle

对指定范围内的元素随机调整次序。

例1

vector<int> vecInt;

                   vecInt.push_back(1);

                   vecInt.push_back(3);

                   vecInt.push_back(5);

                   vecInt.push_back(7);

                   vecInt.push_back(9);

 

                   stringstr("itcastitcast ");

        

                   random_shuffle(vecInt.begin(),vecInt.end());   //随机排序,结果比如:9,7,1,5,3

                   random_shuffle(str.begin(),str.end());                //随机排序,结果比如:" itstcasticat"

 

l  reverse

例1

           vector<int> vecInt;

                   vecInt.push_back(1);

                   vecInt.push_back(3);

                   vecInt.push_back(5);

                   vecInt.push_back(7);

                   vecInt.push_back(9);

 

                   reverse(vecInt.begin(),vecInt.end());               //{9,7,5,3,1}

 

l  fill

将输入值赋给标志范围内的所有元素。

                   vector<int>vecIntA;

                   vecIntA.push_back(1);

                   vecIntA.push_back(3);

                   vecIntA.push_back(5);

                   vecIntA.push_back(7);

                   vecIntA.push_back(9);

                   fill(vecIntA.begin(),vecIntA.end(), 8);               //8, 8,8, 8, 8

 

2. #include <functional>

Bind()

typedef struct _Mystruct

{

   voidadd1(int a)

   {

       cout<<a<<endl;

   }

 

   voidadd2(int a,int b)

   {

       cout<<a<<"  "<<b<<endl;

   }

}Mystruct;

void testbind(int a,int b)

{

   cout<<a<<""<<b<<endl;

}

Int main()

{

       using namespace std::placeholders;    // adds visibility of _1, _2, _3,...

       auto test=bind(testbind,_1,_2);

       test(10,15);

 

        Mystruct testt;

        autotestfun=bind(&Mystruct::add1,&testt,_1);

 

}

 

 

3. #include <numeric>

 

例如:

           vector<int> vecIntA;

                   vecIntA.push_back(1);

                   vecIntA.push_back(3);

                   vecIntA.push_back(5);

                   vecIntA.push_back(7);

                   vecIntA.push_back(9);

                   intiSum = accumulate(vecIntA.begin(), vecIntA.end(), 100);          //iSum==125

 

4.  

5.      各种容器运用时机

²    deque的使用场景:比如排队购票系统,对排队者的存储可以采用deque,支持头端的快速移除,尾端的快速添加。如果采用vector,则头端移除时,会移动大量的数据,速度慢。

²  vector与deque的比较:

²  一:vector.at()比deque.at()效率高,比如vector.at(0)是固定的,deque的开始位置却是不固定的。

²  二:如果有大量释放操作的话,vector花的时间更少,这跟二者的内部实现有关。

²  三:deque支持头部的快速插入与快速移除,这是deque的优点。

²  list的使用场景:比如公交车乘客的存储,随时可能有乘客下车,支持频繁的不确实位置元素的移除插入。

²  set的使用场景:比如对手机游戏的个人得分记录的存储,存储要求从高分到低分的顺序排列。 

²  map的使用场景:比如按ID号存储十万个用户,想要快速要通过ID查找对应的用户。二叉树的查找效率,这时就体现出来了。如果是vector容器,最坏的情况下可能要遍历完整个容器才能找到该用户。

 

《PLECS仿真与实战:从建模到高端应用》-专栏文件目录 《PLECS仿真与实战:从建模到高端应用》是一本系统介绍PLECS电力电子仿真软件的实用指南。全书共10章,首先介绍软件安装与基础操作,包括RC电路仿真等入门内容;随后深入讲解各类电力电子电路的建模与仿真,涵盖整流、交交变换、直流变换、逆变等电路;最后探讨PWM控制建模和直流调速系统等高端应用。书中配有丰富的示例程序和波形分析方法,附录还包含电力电子器件、代码生成等实用资料。该书适合电力电子领域工程师和学生系统学习电路仿真技术。 阅读详情

相关推荐

Centos7安装NVIDIA驱动并在docker容器中使用GPU

Centos7安装NVIDIA驱动并在docker容器中使用GPU

运维giao的博客 2084

STL常用算法——C++

方式一:传入普通函数(printf1) 方式2:利用仿函数,传入匿名函数对象 注意:函数只需要传入函数名就行,但是仿函数需要传入函数对象。for_each在实际开发中是最常用的一个算法,需要熟练掌握 注意:转运之前,需要将目标对象用resize()也开辟相同的空间。 注意:find的返回值是迭代器 底层原理就是二分查找,二分查找需要提前排序好才能用,二分查找需要的算力少。 如果是无序序列,结果未知 总结:对于统计自定义数据类型的时候,需要配合重载operator==

2401_84315007的博客 2400

本地部署 Anything LLM+Ollama+DeepSeek R1 大模型并实现外部访问

DeepSeek 一经发布就引起社会的广泛的关注,因为 DeepSeek 的价格低廉,性能卓越,提供了多种使用方式,满足不同用户的需求和场景。本文将详细的介绍如何在本地 Windows 上安装部署 Anything LLM + Ollama 来实现用户和 DeepSeek-r1 对话的功能以及利用路由侠内网穿透实现外网访问。

lyxnwct的博客 1897

c++ stl常用算法

c++常用算法用法

hutaotaotao的博客 1166

Pcileech(DMA)开源项目简述

希望大DMA家能正确认识FPGA,正确使用DMA技术,对于市场上各类伪装成花里胡哨设备的FPGA板卡它的本质是不会变的,不要上当受骗。

2301_79773847的博客 5963

063、推挽变换器的磁偏问题与解决

本文针对推挽变换器中的磁偏问题展开分析。作者通过实际案例指出,磁偏主要由开关管导通压降差异和驱动信号不对称引起,会导致变压器饱和、MOS管炸毁等问题。文章提供了四种解决方案:采用电流模式控制、添加隔直电容、优化对称驱动设计以及引入磁芯气隙(作为最后手段)。调试时应重点观察原边电流波形对称性、变压器声音和直流分量。作者强调实践经验的重要性,建议预留隔直电容位置,并指出推挽拓扑在500W以上功率场合的局限性。这些基于实战的经验总结为电源工程师提供了有价值的参考。

Jack010169的博客 312

STL-常用算法

STL-常用算法 概述: 算法主要是由头文件<algorithm> functional numeric组成 <algorithm>是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、遍历、复制、修改等等 <numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数 <functional>定义了一些模板类,用以声明函数对象 1. 常用遍历算法 算法简介: for_each //遍历容器 transform //搬运容器到另一个

m0_56783154的博客 338

海康visionmaster-渲染结果:通过绑定流程或模块获取 渲染结果的方法

海康visionmaster-渲染结果:通过绑定流程或模块获取 渲染结果的方法

视觉人机器视觉的博客 2639

STL常用算法笔记

STL常用算法笔记、方便查阅、b站黑马程序员的c++

知道的越多,不知道的越多 1276

有趣的方式学习DDR5(4)—— DDR5 SDRAM 启动与初始化过程全攻略

🟢。

weixin_43199439的博客 1623

[数学建模][2012年A国赛模拟] 3. 葡萄酒的评价

暑期学校数学建模培训第三次模拟:2012年国赛A题,一道完全统计方面的题目。据老师反映当年有位老师所带领小组取得“全国10佳优秀论文奖”,我们大组搞统计的老师建模能力不行,但其统计理论非常扎实,在此期间给予我们非常大的帮助,十分感谢老师的倾囊相授。我们小组的定位也不在统计方向,主攻物理建模及优化模型,故本次模拟就用SPSS软件简单做了下,还是学到了多元统计的许多知识,达到了本次训练的目的。 ...

Y-puyu 的博客 3万+

[数据结构] [C++ STL] 常用算法总结

STL算法部分主要由头文件 <algorithm>,<numeric>,<functional> 组成。要使用 STL中的算法函数必须包含头文件 <algorithm>,对于数值算法须包含 <numeric>,<functional> 中则定义了一些模板类,用来声明函数对象。非可变序列算法:指不直接修改其所操作的容器内容的算法。可变序列算法:指可以修改它们所操作的容器内容的算法。排序算法:包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。数值算法:对容器内容进行数值计算。

m0_73482095的博客 900

全志T527-TP9930-Camera

TP9930 驱动模块主要实现将 4 路的 AHD/TVI/CVBS Camera 的数据转换为 BT656/BT1120 数据,从而实现在 T527 端来对数据进行处理和送显。

Linux驱动开发工程师,熟悉Linux/Android底层驱动、TP、显示、IIC、网络等通用外设调试适配,Linux上层应用开发。常用平台瑞芯微、全志、恩智浦等。 3236

c++提高篇——STL常用算法

算法主要是由头文件 组成。是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、追历操作、复制、修改等等。体积很小,只包括几个在序列上面进行简单数学运算的模板函数。定义了—些模板类.用以声明函数对象。

qq_52302919的博客 2950

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【stl -- 常用算法】

str常用算法讲解及实践操作:for_each、sort、random_shuffle、merge、reverse、copy、replace、swap、accumulate、fill以及集合算法等等,足以满足希望快速上手stl的你。

m0_熊猫馆主的博客 1160

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C++中STL常用算法

STL的常用算法1、常用的遍历算法1、for_each:遍历容器元素2、transform算法 将指定容器区间元素搬运到另一容器中2、常用的查找算法2.1、find算法 查找元素2、find_if条件查找2.3、adjacent_find算法 查找相邻重复元素2.4、binary_search算法 二分查找法(容器必须有序)2.5、count算法 统计元素出现次数2.6、count_if算法 统计...

兰天禄的博客 1488

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【算法】常用STL容器

这是我对写算法题中常用的STL容器的笔记

Canrad Home Page 1626

【STL】函数对象+常用算法

STL函数对象与常用算法摘要 函数对象(仿函数):通过重载()运算符实现的类,行为类似函数调用。具有三大特点: 可像普通函数一样调用,支持参数和返回值 可维护内部状态(如计数器) 可作为参数传递 谓词:返回bool的仿函数,分为: 一元谓词(单参数,如GreaterFive) 二元谓词(双参数,如MyCompare) 内建函数对象: 算术仿函数(plus、minus等) 关系仿函数(greater、less等) 逻辑仿函数(实际较少使用) 常用算法: 遍历算法: for_each:遍历容器元素,可接受普通函

2201_75475240的博客 957

STL常用算法---C++

概述算法主要是由头文件<numeric>组成。是所有STL头文件中最大的一个,范围涉及到比较、 交换、查找、遍历操作、复制、修改等等;<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数;定义了一些模板类,用以声明函数对象。

weixin_63685622的博客 1098

6 c++提高——STL常用算法

【代码】6 c++提高——STL常用算法。

xcxhzjl的博客 1225

stl 中常用的算法

#include <iostream> #include <vector> #include <algorithm> #include <set> using namespace std; //stl -常用算法 //1.常用遍历算法 //1.1for_each 遍历容器 //1.2transform 搬运容器到另一个容器中 //for_...

weixin_41874599的博客 428

C++模板与STL【常用算法】

推荐关注博主,随时获取关于C++的最新技术分享。

m0_51574586的博客 1483

STL常用算法

std::copy这里是一个如何在包含自定义类对象的向量上使用std::sort和public:int value;// 排序// 移除相邻重复元素// 删除重复// 输出结果return 0;通过重载这些操作符,你确保了自定义类型可以与 C++ 标准库的算法(如std::sort和)无缝工作。这个版本的允许你指定一个二元谓词pred,该谓词用来确定两个元素是否被视为“相等”,即当谓词返回true时,两个元素视为重复。

qq_47987543的博客 822

STL算法中常用知识点总结

STL 作为一个封装良好,性能合格的 C++ 标准库,在算法竞赛中运用极其常见。灵活且正确使用 STL 可以节省非常多解题时间,这一点不仅是由于可以直接调用,还是因为它封装良好,可以让代码的可读性变高,解题思路更清晰,调试过程 往往 更顺利。不过 STL 毕竟使用了很多复杂的结构来实现丰富的功能,它的效率往往是比不上自己手搓针对特定题目的数据结构与算法的。因此,STL 的使用相当于使用更长的运行时间换取更高的编程效率。因此,在实际比赛中要权衡 STL 的利弊,不过这一点就得靠经验了。

qq_52482640的博客 1417

【STL】7.STL常用算法(2)

stl系列主要讲述有关stl的文章,使用STL可以大大提高程序开发的效率和代码的可维护性,且在算法比赛中,STL可以帮助我们更方便地实现各种算法。提高我们的效率。算法主要是头文件algorithm,functional,numeric组成1.algorithm是所有STL头文件中最大的一个,范围涉及到比较,交换,查找,遍历操作,复制,修改等等2.numeric体积很小,只包括几个在序列上面进行简单的数学运算的模板函数3.functional定义了一些模板类,用以声明函数对象!!

2401_86663413的博客 971

STL常用算法汇总

algorithm > , < functional > , < numeric > //头文件。遍历算法transform&for_each 查找算法find find_if adjacent_find binary_search count count_if 排序算法sort random_shuffle merge reverse 拷贝和替换算法copy replace replace_if swap 算术生成算法accumulate fill 常用集合算法set_intersection

sad_liu的博客 1538
上一篇: static_cast < type-id > ( expression )与reinterpret_cast<type-id> (expression)的区别
下一篇: C fopen,fseek,fprintf,feof,ftell,rewind
ToConnection
博客等级 码龄16年 4粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值