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

【C++】STL容器、算法的简单认识

几种模板

首先认识一下函数模板、类模板、栈模板。

函数模板

函数模板就是一个模型,而模板函数是函数模板经过类型实例化的函数。

如下template<class T>是一个简单的函数模板:

template<class T>
T Max(T a, T b)
{return a > b ? a : b;
}
int main()
{cout << Max(2, 5) << endl;//与Max匹配的函数叫模板函数cout << Max('t', 'a') << endl;//使用模板不受限于它的类型
}

也可以一次定义几个不同类型

template<class T1, class T2>
void fn(T1 a, T2 b)
{cout << a << " " << b << endl;
}
void main()
{fn('a', 5);
}

类模板

类模板不是类,需要经过参数实例化之后才是可以用的类(创建对象的时候告诉类模板<类型>)

template<class T>
class A
{
public:A(int i=0):m_i(i){}void print() { cout << m_i << endl; }
private:T m_i
};
int main()
{//A a;//errA<int> a(10);//这样经过参数实例化之后才是可以用的类a.print();
}

使用栈模板

自己模拟栈要很长一段代码:

#define SIZE 10
template<class T>
class SeqStack
{
public:SeqStack(){m_capacity = SIZE;m_data = new T[m_capacity];m_top = -1;}~SeqStack(){delete[]m_data;m_data = nullptr;}void Push(int v){if (IsFull())return;m_data[++m_top] = v;}void Pop(){if (IsEmpty()){return;}m_top--;}bool IsEmpty(){return m_top == -1;}bool IsFull(){return m_top >= m_capacity - 1;}int GetTop()  //要优化{if (IsEmpty())return 0;return m_data[m_top];}
private:T* m_data;int m_top;int m_capacity;
};
int main()
{SeqStack<int> ss;ss.Push(1);ss.Push(2);ss.Push(3);while (!ss.IsEmpty()){cout << ss.GetTop() << " ";ss.Pop();}
}

栈模板就可以直接用,带上头文件#include<stack>,很方便,效果跟自己模拟是一样的

int main()
{stack<int> ss;ss.push(1);ss.push(2);ss.push(3);while (!ss.empty()){cout << ss.top() << endl;ss.pop();}
}

STL 标准模板库

STL的重要的组件:容器、算法、迭代器

容器:存放数据

算法:操作数据

迭代器:容器和算法之间的粘合器——通过迭代器把容器里的东西取出,给算法操作(指针)

STL是泛型程序库:所有组件可以针对任意型别运作。

使用

例:从标准输入读取一段整数,将这些整数存放在一个动态开辟的数组中,数组的

第一个元素存储整数的个数,以后依次是这些整数。

void main()
{vector<int> vv;copy(istream_iterator<int>(cin), istream_iterator<int>(),back_insert_iterator<vector<int>>(vv));copy(vv.begin(), vv.end(), ostream_iterator<int>(cout, " "));
}

容器

•容器:用来管理某类对象的集合。容纳特定数据类型对象的集合,STL容器是将最常用的一些数据结构实现出来.包含了许多数据结构,如:vector,queue,statck…,string也可以看作是一个容器.

•分类:容器用来管理一组元素,为了适应不同需要,STL根据数据在容器中排列的特性,容器可分为序列式容器和关联式容器两种.

•序列式容器:可序群集,其中每个元素都有固定位置——取决于插入时机和地点,与元素的值没有关系,如果你以追加方式对一个群集置入n个元素,它们的排列次序将和置入次序一致。如vector,deque,list

•关联式容器:已序群集,元素位置取决于特定的排序准则,和插入顺序无关。如果你将n个元素置入这样的群集中,它们的位置取决于元素值,和插入次序无关。STL提供了4个这样的容器:set,map,。multiset,multimap。

关联式容器也可被视为特殊的序列式容器,因为已序群集正是根据某个排序准则排列而成。

vector容器

向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。

vector:将其元素置于一个动态数组中加以管理,是一种动态数组,是基本数组的类模板,用于代替数组,支持随机存取。

int main()
{vector<int> v;//v里面的构造方法vector<int> v1(5);//5个0vector<int> v2(4, 7);//4个7int arr[5] = { 1,2,3,4,5 };vector<int> v3(arr,arr+5);//1,2,3,4,5for (int i = 0; i < v2.size(); i++)cout << v2[i] << " ";cout << endl;v.push_back(1);v.push_back(2);v.push_back(40);v.push_back(3);for (int i = 0; i < v.size(); i++)cout << v[i] << " ";cout << endl;
}

普通二维数组必须定义列数,如a[][3],但vector的每行列数可以不一样

void main()
{vector<int> v;vector<vector<int>> vv;//vv相当于一个二维数组v.push_back(1);//1vv.push_back(v);//1v.push_back(2);//1 2vv.push_back(v);
//1    
//1 2v.push_back(3);//1 2 3vv.push_back(v);
//1
//1 2    
//1 2 3for (int i = 0; i < vv.size(); i++){for (int j = 0; j < vv[i].size(); j++)cout << vv[i][j] << " ";cout << endl;}
}

vector定义后不能直接赋值,必须有东西存进去再修改

void main()
{vector<int> v;//v.resize(5);v[0] = 5;
//这相当于下面这两行,是不行的//int a;//a[0] = 6;
}

算法

•算法:用来处理群集内的元素。它们可以出于不同的目的而搜寻,排序,修改,使用那些元素。是一种应用在容器上以各种方法处理其内存的行为或功能,如sort(排序),copy(拷贝)…,算法由模板函数体现,这些函数不是容器类的成员函数,是独立的函数,它们可以用于STL容器,也可以用于普通的C++数组等.

•头文件:#include<algorithm>在STL的泛型算法中有4类基本的算法:

1)变序型队列算法: 可以改变容器内的数据;

2)非变序型队列算法:处理容器内的数据而不改变他们;

3)排序值算法:包涵对容器中的值进行排序和合并的算法,还有二叉搜 索算法 ,

4)通用数值算法:此种算法不多,涉及到专业领域中有用的算术操作,独立包涵于头文件<numeric>中,在此不多做解释

排序sort()

使用必须加上头文件#include<algorithm>。

sort默认是做非递减排序,用的类模板,这个自己也可以模拟,如下:

自己也可以写个函数传入sort使其做非递增排序。

bool great(int a, int b)
{return a > b;
}
template<class T>
class Great
{
public:bool operator()(T a, T b){return a > b;}
};
void main()
{int a[] = { 1,3,2,5,4,7,6,9,8,0 };int n = sizeof(a) / sizeof(a[0]);//sort(a, a + n,greater<int>());//sort(a, a + n, great);//函数模板,用函数名当做函数指针传入sort(a, a + n, Great<int>());//类模板,运用了()的重载for (int i = 0; i < n; i++)cout << a[i] << " ";cout << endl;
}

遍历for_each()

for_each()函数是C++ STL中的一个遍历函数,函数原型如下:

for_each(InputIterator first, InputIterator last, Function functor);

拷贝copy()

复制 [first, last) 所定义的范围中的元素到始于 d_first 的另一范围。

函数原型:

template<class InputIterator, class OutputIterator>  
inline OutputIterator copy(  InputIterator first,   InputIterator last,   OutputIterator result  
);

for_each()和copy()的使用:

void print(int n)
{cout << n << " ";
}
int s = 0;
void Sum(int n)
{s = s + n;
}
void main()
{int a[5] = { 1,2,3,4,5 };int b[5];copy(a, a + 5, b);//把[a,a+n)复制到b//    copy(b, b + 5, ostream_iterator<int>(cout, ","));for_each(b, b + 5, print);//输出12345for_each(b, b + 5, Sum);//输出15cout << "s = " << s << endl;
}

反转函数reverse

将区间[iterator1,iterator2)内的元素反转

交换swap_ranges

函数原型:

template<typename T1, typename T2>void swap(std::pair<T1,T2> left, std::pair<T1,T2> right);

前两个参数分别是第一个序列的开始和结束迭代器,第三个参数是第二个序列的开始迭代器。显然,这两个序列的长度必须相同。这个算法会返回一个迭代器,它指向第二个序列的最后一个被交换元素的下一个位置。

使用:

bool great5(int n)
{return n > 5;
}
template<class T>
class Less5
{
public:bool operator()(T n){return n < 5;}
};
void main()
{int a[] = { 1,2,3,4,5 };int b[] = { 6,7,8,9,0 };int n = sizeof(a) / sizeof(a[0]);int* p = find(a, a + n, 15);cout << *(p - 1) << endl;p = find_if(a, a + n, great5);cout << *p << endl;p = find_if(a, a + n, Less5<int>());cout << *p << endl;reverse(a, a + n);swap_ranges(a, a + 3, b);cout << count(a, a + 5, 2) << endl;cout << count_if(a, a + 5, Less5<int>()) << endl;
}

判断包含关系includes

函数原型

template <class InputIterator1, class InputIterator2, class Compare>bool includes ( InputIterator1 first1, InputIterator1 last1,InputIterator2 first2, InputIterator2 last2, Compare comp );

测试 [first1,last1)里面是否包含了[first2,last2)里面的所有元素。

int main(void)
{int a[10] = { 12,0,5,3,6,8,9,34,32,18 };int b[5] = { 5,3,6,8,9 };int d[15];sort(a, a + 10);for (int i = 0; i < 10; i++)cout << " " << a[i];sort(b, b + 5);  // 3 5 6 8 9if (includes(a, a + 10, b, b + 5))  //一个数组是否包含另外一个数组cout << "\n" << "sorted b members are included in a." << endl;elsecout << "sorted a dosn`t contain sorted b!";merge(a, a + 10, b, b + 5, d); //合并for (int j = 0; j < 15; j++)cout << "  " << d[j];return 0;
}

归并排序merge

merge只有归并部分,使用它必须是两个有序数组经行归并(先用sort()排序)

void main()
{int a[5] = { 5,4,1,2,3 };int b[5] = { 6,8,1,4,6 };int c[10];sort(a, a + 5);sort(b, b + 5);merge(a, a + 5, b, b + 5, c);
}

相关文章:

【C++】STL容器、算法的简单认识

几种模板首先认识一下函数模板、类模板、栈模板。函数模板函数模板就是一个模型&#xff0c;而模板函数是函数模板经过类型实例化的函数。如下template<class T>是一个简单的函数模板&#xff1a;template<class T> T Max(T a, T b) {return a > b ? a : b; } …...

把python开发的web服务,打包成docker镜像的方法

要将Python开发的服务打成Docker镜像&#xff0c;可以按照以下步骤操作&#xff1a;1. 创建一个Dockerfile文件&#xff0c;该文件描述了如何构建Docker镜像。例如&#xff0c;以下是一个简单的Dockerfile文件&#xff0c;用于构建一个基于Python的Web应用程序&#xff1a; FRO…...

【Linux】多线程

进程和线程进程&#xff1a;一个正在运行的程序。状态&#xff1a;就绪&#xff0c;运行&#xff0c;阻塞&#xff1b;线程是进程中的一个执行路径&#xff0c;一个进程中至少有一个主线程&#xff08;main函数&#xff09;&#xff1b;有多条执行路径为多线程。创建一个线程用…...

Qt 设置窗口背景图片的几种方法实例

1.在paintEvent事件中绘制图片 void Widget::paintEvent(QPaintEvent * ev) {QPainter painter(this);painter.drawPixmap(rect(),QPixmap(":/bg.jpg"),QRect()); } drawPixmap在Widget的整个矩形区域绘制背景图片&#xff0c;第三个参数为要绘制的图片区域&#x…...

springcloud微服务架构搭建过程

项目地址&#xff1a;源代码 仅作为学习用例使用&#xff0c;是我开发过程中的总结、实际的一部分使用方式 开发环境&#xff1a; jdk11 springboot2.7.6 springcloud2021.0.5 alibabacloud 2021.0.4.0 redis6.0 mysql8.0 一、项目搭建 wdz-api&#xff1a;存放远程服务调用相关…...

LeetCode:215. 数组中的第K个最大元素

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340;算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;215. 数组中的第K个最大元素 题目描述&#xff1a;给定整数数组nums和整…...

vue面试题(day06)

文章目录前言请谈谈WXML与标准的html的异同&#xff1f;请谈谈WXSS和CSS的异同&#xff1f;请谈谈微信小程序主要目录和文件的作用&#xff1f;请谈谈小程序的双向绑定和vue的异同&#xff1f;简单描述下微信小程序的相关文件类型&#xff1f;微信小程序有哪些传值(传递数据)方…...

22 k8s常用命令

一、k8s网络 service网络 pod网络 节点网络 》 svc、pod网络都是虚拟机网络&#xff0c;真实网络是节点网络 二、内核升级 因为coentos系统3.10存在一些bug&#xff0c;docker、kubernetes不稳定&#xff0c;建议升级到4.4版本以上 三、集群资源分类 名称空间级别&#xff1…...

基于ESP32做低功耗墨水屏时钟

基于ESP32做低功耗墨水屏时钟电子墨水屏概述ESP32实验低功耗电子时钟功能描述接线开发实验结果电子墨水屏 概述 电子墨水是一种革新信息显示的新方法和技术。和传统纸差异是电子墨水在通电时改变颜色&#xff0c;并且可以显示变化的图象&#xff0c;像计算器或手机那样的显示。…...

常见路由器开源系统(固件)简介

前段时间在折腾如何通过 SD-WAN 组网方式打通办公室和家里的异地局域网。需要用到路由器的静态路由表功能&#xff0c;但是遍历整个家用路由器市场几乎没有支持这个功能的路由器&#xff08;只有华硕 RT-AX57 有这个功能&#xff0c;但是成本超出了我的预算&#xff09;。所有就…...

HCIE-Cloud Computing LAB备考第二步:逐题攻破--第二题:FusionAccess-搭建FA实验环境之安装基础组件和初始化ITA组件

HCIE-Cloud Computing LAB备考第二步:逐题攻破–第二题:FusionAccess-思维导图+题目=建立逻辑 专业术语 名词描述备注FusionAccess华为推出的桌面云产品,是一种虚拟桌面应用,它主要通过在硬件上部署FusionAccess配套的软件基础上,虚拟化出相互隔离的桌面,用户通过瘦客户端…...

Android APP检查设备是否为平板

正文 Android APP判断设备是否为平板的三种方法&#xff1a; 通过屏幕尺寸判断。一般来说&#xff0c;平板电脑的屏幕尺寸比手机大很多&#xff0c;可以根据屏幕的长宽比和尺寸等信息来区分设备类型。通过屏幕像素密度判断。一般来说&#xff0c;平板电脑的屏幕像素密度比手机…...

MP:使用步骤、分页、queryWrapper

Mybatis-Plus 官网&#xff1a; MyBatis-Plus (baomidou.com) 1. 意义 mybatis-plus是一个插件&#xff0c;它不能单独使用&#xff0c;必须配合mybatis使用&#xff0c;作用是简化mybatis操作&#xff0c;通过使用MP提供的方法&#xff0c;自动生成SQL语句进行CRUD 2. 使用步骤…...

C++ string类

C string类讲解 1、为什么学习string类&#xff1f; C语言中的字符串 在C语言中&#xff0c;字符串是以’\0’结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符…...

虚拟机断电centos无法启动

虚拟机断电后centos7无法正常启动 XFS(sda3) 首先需要查找日志 在界面中查找日志是 journalctl 1.由于我的电脑死机&#xff0c;虚拟机没有正常关闭导致重启后 node1节点&#xff1a;可以登陆但是出现XFS(sda3)&#xff1a;Corruption of in-memoru data detectednode2节点&…...

python学习之基于Python的人脸识别技术学习

摘要&#xff1a; 面部识别技术的应用越来越广泛&#xff0c;它广泛应用于安全系统、人机交互、社交媒体、医疗保健等领域。本文介绍了基于Python的人脸识别技术&#xff0c;包括人脸检测、人脸特征提取和人脸识别三个部分。我们使用OpenCV和Dlib库来实现这些功能&#xff0c;…...

[Qt][Android] Qt for Android 环境搭建

建议使用 Linux 环境开发 Qt for Android&#xff0c;Windows 环境不好弄&#xff0c;问题多。 直接按照官方文档给的流程进行一步步做就行了&#xff1a; Getting Started with Qt for Android | Qt 6.4https://doc.qt.io/qt-6/android-getting-started.html建议使用 ubuntu…...

maven setting 配置

<?xml version"1.0" encoding"UTF-8"?><settings xmlns"http://maven.apache.org/SETTINGS/1.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/SETTINGS/1.0.0…...

【0基础学爬虫】爬虫基础之网络请求库的使用

大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到难全方位覆盖&#xff0c;特设【0基础学…...

超级实用,解密云原生监控技术,使用prometheus轻松搞定redis监控

前言 大家好&#xff0c;我是沐风晓月&#xff0c;本文收录于《 prometheus监控系列》 &#xff0c;截止目前prometheus专栏已经更新到第8篇文章。 本文中的是prometheus已经安装好&#xff0c;如果你还未安装&#xff0c;可以参考 prometheus安装及使用入门 若你想监控其他…...

AsyncSerial:嵌入式非阻塞串口通信实现

1. AsyncSerial 库深度解析&#xff1a;面向嵌入式实时系统的非阻塞串口通信实现 在嵌入式系统开发中&#xff0c;串口&#xff08;UART/USART&#xff09;通信因其硬件资源占用少、协议简单、调试便捷等优势&#xff0c;始终是固件层最基础且高频使用的外设接口。然而&#xf…...

这份榜单够用!高效论文写作全流程AI论文软件推荐(2026 最新)

2026年AI论文软件持续升级&#xff0c;论文写作全流程可拆解为文献调研→选题/开题→大纲/初稿→文献综述→降重/去AI味→润色/格式→查重/投稿七大环节&#xff0c;以下工具按环节精准匹配&#xff0c;兼顾中文适配、降重能力、去AI痕迹、学术合规四大核心需求&#xff0c;覆盖…...

Claude Code智能测试生成:5步构建企业级自动化测试体系

Claude Code智能测试生成&#xff1a;5步构建企业级自动化测试体系 【免费下载链接】claude-code Claude Code is an agentic coding tool that lives in your terminal, understands your codebase, and helps you code faster by executing routine tasks, explaining comple…...

基于STM32F103与HAL库的总线舵机多模式运动控制实战

1. STM32F103与HAL库开发环境搭建 第一次接触STM32F103和HAL库的朋友可能会觉得有点懵&#xff0c;其实搭建开发环境比你想象中简单多了。我当初用STM32CubeMX配置项目时踩过不少坑&#xff0c;现在把这些经验都分享给你。 首先得准备好硬件&#xff0c;你需要一块STM32F103开发…...

实战指南:基于OpenSpec规范,使用快马平台生成可直接集成的微服务客户端代码

今天在微服务开发中遇到一个典型需求&#xff1a;我们的支付网关服务已经用OpenAPI 3.0规范定义好了接口&#xff0c;现在需要在另一个Java服务中调用这些接口。传统做法要手动写HTTP客户端代码&#xff0c;既耗时又容易出错。最近发现InsCode(快马)平台能基于OpenSpec文档自动…...

从理论到实践:在快马平台构建基于openclaw的物流分拣仿真系统

最近在研究物流自动化分拣系统时&#xff0c;发现openclaw机械爪控制在实际应用中存在不少痛点。传统开发流程需要从零搭建仿真环境、编写控制逻辑、调试物理交互&#xff0c;整个过程耗时耗力。于是尝试用InsCode(快马)平台快速构建了一个物流分拣仿真系统&#xff0c;效果出乎…...

别再拍脑袋定权重了!多目标规划中权重和ε值确定的3种科学方法

多目标规划中权重与约束值的科学确定方法&#xff1a;从理论到实践 1. 多目标规划的核心挑战与参数确定的重要性 在现实世界的决策场景中&#xff0c;我们很少遇到仅需优化单一目标的简单问题。无论是产品设计、资源分配还是投资组合管理&#xff0c;决策者往往需要同时考虑多个…...

5G NR随机接入实战:手把手教你理解并排查MSG3发送失败的那些坑

5G NR随机接入实战&#xff1a;MSG3发送失败全场景排查指南 当5G终端尝试接入网络时&#xff0c;随机接入过程中的MSG3发送失败是最常见的"拦路虎"之一。作为网络优化的关键指标&#xff0c;MSG3失败直接影响用户体验和网络KPI。本文将带您深入协议栈底层&#xff0c…...

别再只盯着GPS了!从手机导航到无人机测绘,聊聊SPP、DGPS、RTK、PPP这几种定位技术到底该怎么选?

定位技术实战指南&#xff1a;从厘米级精度到全球覆盖的智能决策 站在一片待测绘的工地上&#xff0c;无人机工程师小王正面临一个关键抉择——该为这批新设备配置哪种定位模块&#xff1f;RTK的厘米级精度令人心动&#xff0c;但架设基准站的成本让他犹豫&#xff1b;PPP技术号…...

Simple Runtime Window Editor:突破窗口分辨率限制的技术实现与应用指南

Simple Runtime Window Editor&#xff1a;突破窗口分辨率限制的技术实现与应用指南 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 一、场景化问题诊断&#xff1a;分辨率调整的现实挑战 1.1 专业设计工作流的…...