【嵌入式——C++】算法(STL)

这篇具有很好参考价值的文章主要介绍了【嵌入式——C++】算法(STL)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


需要引入头文件 #include <algorithm>

遍历算法

for_each

遍历容器。
代码示例

//普通函数
void print01(int val) {
 cout << val << " ";
}

//仿函数
class print02 {
public :
 void operator()(int val) {
  cout << val << " ";
 }
};

void testForEach() {
 vector<int> v;

 for (int i = 0; i < 10;i++) {
  v.push_back(i);
 }
 for_each(v.begin(),v.end(), print01);//0 1 2 3 4 5 6 7 8 9
 cout << endl;
 for_each(v.begin(), v.end(), print02());//0 1 2 3 4 5 6 7 8 9
}

transform

搬运容器到另一个容器中。参数1 原容器起始迭代器,参数2 原容器结束迭代器,参数3 目标容器开始迭代器 参数4 函数或者仿函数。
代码示例

class Transform {

public:
 int operator()(int v) { 
  return v+100;
 }

};

void testTransform() {
 vector<int> v;

 for (int i = 0; i < 10; i++) {
  v.push_back(i);
 }
 vector<int> target;
 target.resize(v.size());
 transform(v.begin(),v.end(),target.begin(), Transform());

 for_each(target.begin(), target.end(), print02());// 100 101 102 103 104 105 106 107 108 109
}

查找算法

find

查找元素,查找指定元素,找到返回指定元素的迭代器,找不到返回结束迭代器end()。
代码示例

class Person {
public:
 Person(string name, int age) {
  this->name = name;
  this->age = age;
 }
 string name;
 int age;

 //重载== 为了让底层知道怎么比较数据
 bool operator==(const Person& p){
  if (this->name == p.name && this->age == p.age) {
   return true;
  }
  else {
   return false;
  }
 }
};

void testFind() {

 vector<int> v;
 for (int i = 0; i < 10; i++) {
  v.push_back(i);
 }
 vector<int> ::iterator it = find(v.begin(),v.end(),6);
 if (it != v.end()) {
  cout << *it << " "; //6
 }
 
 Person p1("111",20);
 Person p2("222",23);
 Person p3("333", 33);
 Person p4("444", 55);


 vector<Person> vp;
 vp.push_back(p1);
 vp.push_back(p2);
 vp.push_back(p3);
 vp.push_back(p4);

 vector<Person> ::iterator it1 = find(vp.begin(), vp.end(), p2);
 if (it1 != vp.end()) {
  cout << it1->name << " " << it1->age<<endl; // 222 23
 }
}

find_if

按条件查找元素,参数1 开始迭代器 参数2 结束迭代器 参数3 谓词(返回bool类型的仿函数)。
代码示例

class GreaterFive {
public :
 bool operator()(int val) {
  return val > 5;
 }
};

class Greater20 {
public :
 bool operator()(Person &p) {
  return p.age > 20;
 }
};

void testFindIf() {

 vector<int> v;
 for (int i = 0; i < 10; i++) {
  v.push_back(i);
 }
 //找到大于5的数
 vector<int>::iterator it = find_if(v.begin(), v.end(), GreaterFive());
 if (it != v.end()) {
  cout << *it<<" "; // 6
 }

 Person p1("111", 20);
 Person p2("222", 23);
 Person p3("333", 33);
 Person p4("444", 55);

 vector<Person> vp;
 vp.push_back(p1);
 vp.push_back(p2);
 vp.push_back(p3);
 vp.push_back(p4);

 //找到年龄大于20的
 vector<Person>::iterator it1 = find_if(vp.begin(), vp.end(), Greater20());
 if (it1 != vp.end()) {
  cout << it1->name << " "; // 222
 }
}

adjacent_find

查找相邻重复元素,返回相邻元素的第一个位置的迭代器。
代码示例

void testAdjacen() {
 vector<int> v;
 for (int i = 0; i < 10; i++) {
  v.push_back(i);
 }
 v.push_back(2);
 v.push_back(1);
 v.push_back(1);
 v.push_back(3);
 v.push_back(4);
 v.push_back(5);
 v.push_back(5);

 vector<int>::iterator it = adjacent_find(v.begin(),v.end());
 cout << *it << " "; //1

}

binary_search

二分查找法,查找指定元素是否存在,在无序序列中不可用,查到返回true(1),查不到返回false(0)。
代码示例

void testBinary() {
 vector<int> v;
 for (int i = 0; i < 10; i++) {
  v.push_back(i);
 }

 bool b = binary_search(v.begin(), v.end(),6);
 cout << b<<endl; // 1
}

count

统计元素出现的次数 参数1 开始迭代器 参数2 结束迭代器 参数3 统计的元素。
代码示例

class Person {
public:
 Person(string name, int age) {
  this->name = name;
  this->age = age;
 }
 string name;
 int age;

 //重载==
 bool operator==(const Person& p){
  if (this->name == p.name && this->age == p.age) {
   return true;
  }
  else {
   return false;
  }
 }
};

void testCount() {
 vector<int> v;
 for (int i = 0; i < 10; i++) {
  v.push_back(i);
 }
 v.push_back(6);
 v.push_back(6);
 v.push_back(6);
 v.push_back(6);

 int a = count(v.begin(), v.end(), 6);
 cout << a << endl; //5


 Person p1("111", 20);
 Person p2("222", 23);
 Person p3("333", 33);
 Person p4("444", 55);

 Person p("444", 55);

 vector<Person> vp;
 vp.push_back(p1);
 vp.push_back(p2);
 vp.push_back(p3);
 vp.push_back(p4);
//容器中和p姓名相同 年龄相同的数量
 int c = count(vp.begin(), vp.end(), p);
 cout << c << endl; //1

}

count_if

按条件统计元素个数,参数1 开始迭代器 参数2 结束迭代器 参数3 谓词。
代码示例

class GreaterFive {
public :
 bool operator()(int val) {
  return val > 5;
 }
};

class Greater20 {
public :
 bool operator()(Person &p) {
  return p.age > 20;
 }
};

void testCountIf() {

 vector<int> v;
 for (int i = 0; i < 10; i++) {
  v.push_back(i);
 }

 //统计大于5的数
 int c= count_if(v.begin(), v.end(), GreaterFive());
 cout << c << endl; //4


 Person p1("111", 14);
 Person p2("222", 16);
 Person p3("333", 22);
 Person p4("444", 55);

 vector<Person> vp;
 vp.push_back(p1);
 vp.push_back(p2);
 vp.push_back(p3);
 vp.push_back(p4);

 int cc = count_if(vp.begin(), vp.end(), Greater20());
 cout << cc << endl;// 2
}

排序算法

sort

对容器内元素进行排序,默认升序,参数1 开始迭代器 参数2 结束迭代器 参数3 谓词。
代码示例

void testSort() {
 vector<int> v;
 for (int i = 0; i < 10; i++) {
  v.push_back(i);
 }
 printVector(v);0 1 2 3 4 5 6 7 8 9

 //默认升序
 sort(v.begin(),v.end());
 printVector(v);//0 1 2 3 4 5 6 7 8 9

 //添加谓词 降序
 sort(v.begin(), v.end(),greater<int>());
 printVector(v);//9 8 7 6 5 4 3 2 1 0

}

random_shuffle

洗牌 指定范围内的元素随机调整次序。
代码示例


void testRandomShuffle() {
 //该行代码是为了每次随机排序结果不一样 
 srand((unsigned int)time(NULL));

 vector<int> v;
 for (int i = 0; i < 10; i++) {
  v.push_back(i);
 }
 printVector(v);//0 1 2 3 4 5 6 7 8 9
 random_shuffle(v.begin(), v.end());
 printVector(v);//8 1 9 2 0 5 7 3 4 6
 
}

merge

两个容器元素合并,并存储到另一容器中,两个容器必须是有序的,参数1 容器1开始迭代器 参数2 容器1结束迭代器 参数3 容器2开始迭代器 参数4 容器2结束迭代器 参数5 目标容器开始迭代器。
代码示例

void testMerge() {
 vector<int> v;
 for (int i = 0; i < 10; i++) {
  v.push_back(i);
 }

 vector<int> v1;
 for (int i = 10; i < 20; i++) {
  v1.push_back(i);
 }

 vector<int> v2;
 v2.resize(v.size()+ v1.size());
 merge(v.begin(),v.end(),v1.begin(),v1.end(),v2.begin());

 printVector(v2);//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
}

reverse

反转指定范围的元素。
代码示例


void testReverse() {

 vector<int> v;
 for (int i = 0; i < 10; i++) {
  v.push_back(i);
 }

 reverse(v.begin(), v.end());
 printVector(v);//9 8 7 6 5 4 3 2 1 0
}

拷贝算法和替换算法

copy

容器内指定范围的元素拷贝到另一容器中。
代码示例

void testCopy() {
 vector<int> v;
 for (int i = 0; i < 10; i++) {
  v.push_back(i);
 }

 vector<int> target;
 target.resize(v.size());
 copy(v.begin(),v.end(),target.begin());
 printVector(target);//0 1 2 3 4 5 6 7 8 9
}

replace

将容器内指定范围的旧元素修改为新元素,参数1 开始迭代器 参数2 结束迭代器 参数3 旧元素 参数4 新元素。
代码示例

void testReplace() {
 vector<int> v;
 for (int i = 0; i < 10; i++) {
  v.push_back(i);
 }
 v.push_back(6);

 printVector(v);//0 1 2 3 4 5 6 7 8 9 6
 replace(v.begin(), v.end(),6,100);
 printVector(v);//0 1 2 3 4 5 100 7 8 9 100
}

replace_if

容器内指定范围满足条件的元素替换为新元素,参数1 开始迭代器 参数2 结束迭代器 参数3 谓词 参数4 新元素。
代码示例

class GreaterFive {
public :
 bool operator()(int val) {
  return val > 5;
 }
};

void testReplaceIf() {

 vector<int> v;
 for (int i = 0; i < 10; i++) {
  v.push_back(i);
 }
 printVector(v);//0 1 2 3 4 5 6 7 8 9
 //大于5的 都替换为100
 replace_if(v.begin(), v.end(), GreaterFive(), 100);
 printVector(v);//0 1 2 3 4 5 100 100 100 100
}

swap

互换两个容器的元素,必须是同种类型的容器,参数1 容器1 参数2 容器2。
代码示例

void testSwap() {
 vector<int> v;
 for (int i = 0; i < 10; i++) {
  v.push_back(i);
 }

 vector<int> v2;
 for (int i = 10; i < 20; i++) {
  v2.push_back(i);
 }
 printVector(v);//0 1 2 3 4 5 6 7 8 9
 printVector(v2);//10 11 12 13 14 15 16 17 18 19
 swap(v,v2);
 printVector(v);//10 11 12 13 14 15 16 17 18 19
 printVector(v2);//0 1 2 3 4 5 6 7 8 9
}

算术生成算法

引入头文件 #include <numeric>

accumulate

计算容器元素累计总和,参数1 开始迭代器 参数2 结束迭代器 参数3 起始值。

代码示例

void testAccumulate() {
 vector<int> v;
 for (int i = 0; i <= 100; i++) {
  v.push_back(i);
 }

 int sum = accumulate(v.begin(),v.end(),0);
 cout << "sum=" << sum<<endl;//sum=5050
}

fill

将容器区间内元素填充为指定的值,参数1 开始迭代器 参数2 结束迭代器 参数3 添加值。
代码示例

void testFill() {
 vector<int> v;
 for (int i = 0; i < 10; i++) {
  v.push_back(i);
 }
 printVector(v);//0 1 2 3 4 5 6 7 8 9
 fill(v.begin(), v.end(),1230);
 printVector(v);//1230 1230 1230 1230 1230 1230 1230 1230 1230 1230
}

集合算法

set_intersection

求两个集合的交集,两个集合必须是有序序列,目标容器开辟空间需要从两个容器中取最小值,返回的值是最后一个元素的位置。参数1 容器1开始迭代器 参数2 容器1结束迭代器 参数3 容器2开始迭代器 参数4 容器2结束迭代器 参数5 目标迭代器。
代码示例

void testIntersection() {
 vector<int> v;
 vector<int> v2;
 for (int i = 0; i < 10; i++) {
  v.push_back(i);
  v2.push_back(i+4);
 }

 vector<int> target;
 target.resize(min(v.size(), v2.size()));
 //返回最后一个迭代器
 vector<int>::iterator itEnd = set_intersection(v.begin(),v.end(),v2.begin(),v2.end(),target.begin());

 //遍历
 for (vector<int>::iterator it = target.begin(); it != itEnd; it++) {
  cout << *it << " ";// 4 5 6 7 8 9
 }
 cout << endl;
 //这个是遍历容器中所有的元素
 printVector(target);//4 5 6 7 8 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0
}

set_union

求两个集合的并集,两个集合必须是有序序列,目标容器开辟空间是两个容器的和,返回的值是最后一个元素的位置,参数1 容器1开始迭代器 参数2 容器1结束迭代器 参数3 容器2开始迭代器 参数4 容器2结束迭代器 参数5 目标迭代器。
代码示例

void testUion() {
 vector<int> v;
 vector<int> v2;
 for (int i = 0; i < 10; i++) {
  v.push_back(i);
  v2.push_back(i + 4);
 }
 vector<int> target;
 target.resize(v.size()+ v2.size());
 vector<int>::iterator itEnd = set_union(v.begin(), v.end(), v2.begin(), v2.end(), target.begin());
 for (vector<int>::iterator it = target.begin(); it != itEnd; it++) {
  cout << *it << " ";// 0 1 2 3 4 5 6 7 8 9 10 11 12 13
 }
 cout << endl;

 printVector(target);//0 1 2 3 4 5 6 7 8 9 10 11 12 13 0 0 0 0 0 0
}

set_difference

求两个容器的差集,两个集合必须是有序序列,目标容器开辟空间需要从两个容器中取最大值,返回的值是最后一个元素的位置,参数1 容器1开始迭代器 参数2 容器1结束迭代器 参数3 容器2开始迭代器 参数4 容器2结束迭代器 参数5 目标迭代器。
代码示例文章来源地址https://www.toymoban.com/news/detail-826309.html

void testDifference() {
 vector<int> v;
 vector<int> v2;
 for (int i = 0; i < 10; i++) {
  v.push_back(i);
  v2.push_back(i + 4);
 }
 printVector(v);//0 1 2 3 4 5 6 7 8 9
 printVector(v2);//4 5 6 7 8 9 10 11 12 13
 vector<int> target;
 target.resize(max(v.size(),v2.size()));

 //v和v2的差集
 vector<int>::iterator itEnd = set_difference(v.begin(), v.end(), v2.begin(), v2.end(), target.begin());
 for (vector<int>::iterator it = target.begin(); it != itEnd; it++) {
  cout << *it << " ";//  0 1 2 3
 }
 cout << endl;

 //v2和v的差集
 vector<int>::iterator itEnd1 = set_difference(v2.begin(), v2.end(),  v.begin(), v.end(),  target.begin());
 for (vector<int>::iterator it = target.begin(); it != itEnd1; it++) {
  cout << *it << " ";//  10 11 12 13
 }
 cout << endl;
}

到了这里,关于【嵌入式——C++】算法(STL)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++嵌入式编程:硬件控制与物联网

    C++是一种功能强大的编程语言,被广泛应用于嵌入式系统的开发和物联网(IoT)应用程序的编写。C++具有高性能、灵活性以及强大的硬件控制能力,使其成为嵌入式编程和物联网开发的理想选择。在本文中,我们将讨论C++在硬件控制和物联网应用中的重要性、应用领域以及一

    2024年01月16日
    浏览(60)
  • C/C++|物联网开发入门+项目实战|函数输入与输出|值传递|地址传递|连续空间的传递|嵌入式C语言高级|C语言函数的使用-学习笔记(11)

    参考: 麦子学院-嵌入式C语言高级-C语言函数的使用 一堆代码的集合,用一个标签去描述它 复用化,降低冗余度 标签 ------ 函数名 函数和数组都属于内存空间,函数具备3要素: int *p; int a[100]; 1、函数名(地址) 2、输入参数 3、返回值 在定义函数时,必须将3要素告知编译器

    2023年04月20日
    浏览(55)
  • 启动电容与运行电容-电容-嵌入式开发-物联网开发

            启动电容与运行电容常常在单相异步电动机相关电路中十分常见,可以通过电容上标注的字母来区分,启动电容以CD开头,而运行电容以CBB开头。         启动电容以CD标识开头,一般来说其 耐压值小,容量大 。         启动电容一般与离心开关串联,电机启动以

    2024年02月13日
    浏览(65)
  • Qt固件映像 Raspberry Pi 嵌入式C++(Qt)编程

    在我们的游戏中,我们有一个桨、一个球和三十块砖。 计时器用于创建游戏周期。 我们不处理角度,我们只是改变方向:上、下、左、右。 Qt5 库是为创建计算机应用程序而开发的。尽管如此,它也可以用来创建游戏。开发计算机游戏是了解有关 Qt5 的更多信息的好方法。

    2024年01月19日
    浏览(43)
  • 嵌入式物联网STM32实战开发代码例程库

    几百个例程清单,CSDN下载地址: https://download.csdn.net/download/weixin_39804904/88671879 开发例程清单(持续新增中,欢迎点赞关注): 0001基于STM32F103单片机GPIO实现控制LED灯闪烁的程序代码0001.rar 0002基于STM32F103单片机GPIO实现按键KEY的检测程序代码0002.rar 0003基于STM32F103单片机GPIO实现

    2024年02月02日
    浏览(50)
  • 嵌入式开发板qt gdb调试

    1) 启动 gdbserver ssh 或者 telnet 登陆扬创平板 192.168.0.253, 进入命令行执行如下: chmod 777 /home/HelloWorld (2) 打 开 QTcreator-Debug-StartDebugging-Attach to Running Debug Server 进行如下设置,设置监听端口10000. 点击上图中的按钮,由于按钮中的函数设置了断点,则跳到断点,界面如下

    2024年02月04日
    浏览(95)
  • Qt/C++编写物联网管理平台(支持win/linux/mac/嵌入式linux/modbus等)

    这个物联网综合管理平台前后迭代了五年,一点一滴慢慢积累起来,从最开始的只有modbus串口协议解析以及简单的表格显示数据,慢慢的逐渐增加了tcp_rtu支持,用户管理模块,地图监控模块,而后为了拓展性又做了云端数据同步,网络数据转发等。编写这个系统的过程中,真

    2024年02月10日
    浏览(183)
  • 嵌入式Qt 开发一个音乐播放器

    上篇文章:RK3568源码编译与交叉编译环境搭建,进行了OK3568开发板软件开发环境搭建,通过编译RK3568的源码,可以得到Qt开发的交叉编译相关工具。 本篇,就来在搭建好的软件开发中,进行Qt软件的开发测试。由于Qt是支持跨平台的,因此本篇的音乐播放器,先在Windows上编写

    2024年02月02日
    浏览(49)
  • 【嵌入式Qt开发入门】初识Qt——Linux下安装Qt

            Qt 是一个跨平台的 C++开发库。主要用来开发图形用户界面(Graphical User Interface,简 称 GUI)程序。         Qt 虽然经常被当做一个 GUI 库,用来开发图形界面应用程序,但这并不是 Qt 的全部; Qt 除了可以绘制漂亮的界面(包括控件、布局、交互),还包含很多

    2024年02月16日
    浏览(59)
  • Azure RTOS & 嵌入式无线网络框架简化物联网应用开发

    一、Azure RTOS概述 Azure RTOS 是一个实时操作系统 (RTOS),适用于由微控制器 (MCU) 提供支持的物联网 (IoT) 和边缘设备, Azure RTOS 旨在支持高度受限设备(电池供电,并且闪存容量不到 64 KB)。简而言之,这就是一套完整的针对于物联网应用开发的带有多线程功能,中间件和桌面

    2024年02月08日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包