当前位置: 首页 > 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安装及使用入门 若你想监控其他…...

音视频开发—MediaCodec 解码H264/H265码流视频

使用MediaCodec目的 MediaCodec是Android底层多媒体框架的一部分&#xff0c;通常与MediaExtractor、MediaMuxer、AudioTrack结合使用&#xff0c;可以编码H264、H265、AAC、3gp等常见的音视频格式 MediaCodec工作原理是处理输入数据以产生输出数据 MediaCodec工作流程 Med…...

CVPR 2023|淘宝视频质量评价算法被顶会收录

近日&#xff0c;阿里巴巴大淘宝技术题为《MD-VQA: Multi-Dimensional Quality Assessment for UGC Live Videos》—— 适用于无参考视频质量评价的最新研究成果被计算机视觉领域顶级会议IEEE/CVF Computer Vision and Pattern Recognition Conference 2023&#xff08;CVPR 20…...

【C++学习】继承

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《C学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; C是面向对象的编程语言&#xff0c;它有很多的特性&#xff0c;但是最重要的就是封装&#xff0c;继承…...

【03173】2020年8月高等教育自学考试-软件开发工具

一、单项选择题&#xff1a;1. 区别于一般软件&#xff0c;对软件开发工具而言&#xff0c;下列各项最重要的性能是 A. 效率 B. 响应速度C. 资源消耗 D. 使用方便2. 在软件开发过程的信息需求中&#xff0c;属于跨开发周期的信息是A. 有关系统环境的需求信息 B. 有关软件设计的…...

Java中的String类

String类1.String类1.1 特性1.2 面试题1.3 常用方法1.4 String与其他类型之间的转换2. StringBuilder类、StringBuffer类&#xff1a;可变字符序列1.String类 1.1 特性 String类为final类&#xff0c;不可被继承&#xff0c;代表不可变的字符序列&#xff1b; 实现了Serializ…...

【java】笔试强训Day3【在字符串中找出连续最长的数字串与数组中出现次数超过一半的数字】

目录 ⛳选择题 1.以下代码运行输出的是 2.以下程序的输出结果为 3.下面关于构造方法的说法不正确的是 ( ) 4.在异常处理中&#xff0c;以下描述不正确的有&#xff08; &#xff09; 5.下列描述中&#xff0c;错误的是&#xff08; &#xff09; 6.…...

一文7个步骤从0到1教你搭建Selenium 自动化测试环境

【导语】Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。本文详细介绍了搭建自动化测试环境所需的工具&#xff0c;让你学习自动化测试不…...

Oracle目录应急清理

Oracle目录应急清理清理错误位置的归档日志清理30天前的监听告警日志清理监听日志清理30天以前的trace文件清理30天以前的审计日志清理错误位置的归档日志 检查$ORACLE_HOME/dbs下是否有归档文件&#xff1a; ls $ORACLE_HOME/dbs/arch* | wc -l检查和修改归档位置&#xff1…...

使用 OBS 进行区域录制

1. OBS 与区域录屏 实际上 OBS 的使用场景可谓是与区域录屏格格不入的。 虽然我们依旧有一些办法在 OBS 中达到区域录屏的目的&#xff0c;但其操作实在过于繁琐&#xff0c;还不如直接使用 QQ 或者 Windows 最新的自带截屏录屏来进行区域录屏来的方便实在。 但若非常强烈的…...

aws eks 配置授权额外的用户和角色访问集群

参考资料 https://github.com/kubernetes-sigs/aws-iam-authenticator#full-configuration-formathttps://docs.amazonaws.cn/zh_cn/eks/latest/userguide/add-user-role.html 众所周知&#xff0c;aws eks使用 Authenticator 或者 aws 命令来进行账户级别的用户和角色的授权…...