C++STL标准模版库、algorithm

从零开始用TS开发babylonjs - 本机环境搭建 babylonjs,初始化本地安装,web3d引擎 阅读详情

一、概述

STL的一个重要特点就是数据结构和算法的分离

STL中包含的是堆栈、队列和其他许多标准数据结构的实现和许多重要泛化算法的实现。

STL提供大量的模版类和函数,其中最常用的是迭代器、容器、算法。

为避免和其他头文件冲突以及确保移植性,在头文件书写时缺省.h后缀

二、容器

容器类库中有7种类型:

  • 向量
  • 列表
  • 双端列表
  • 集合
  • 映射
  • 栈
  • 队列

其中,前三个是顺序容器,中间两个是关系式容器,后两个是容器适配。

数据结构描述头文件
向量<vector>连续存储元素,就像数组,自带实用性函数方法<vector>
列表<list>由节点组成的双向链表,每个节点包含一个元素<list>
双端列表<deque>连续存储的指向不同元素的指针所组成的数组<deque>
集合<set>由结点组成的红黑树,每个结点都包含着一个元素,结点之间以某种作用于元素对的谓词排序,没有两个不同的元素能够拥有相同的次序<set>
映射<map>由{key,value}组成的集合,以某种作用于键对上的谓词排序<map>
栈<stack>后进先出顺序<stack>
队列<queue>先进先出顺序<queue>

以下使用了using namespace std;,如果没有使用需要添加std::,如std::vector<int> v;。为了编写方便,我以下都省略此操作。

1、vector

    vector<int> v;			//int型数组,是空的
    vector<int> v(10);		//int类型,定义大小为10
    vector<int> v(10,'a');	//直接初始化10个a字符
    vector<int> v(b);		//将b赋给v,b也是vector
    vector<int> v(b.begin(),b.begin()+4);	//将向量b的前五个数赋给v
    vector<int> v(a,a+4);	//a是个容量大于等于5的数组
	v.size();		//容器尺寸大小
	v.empty();		//判断v是否为空,空反1,实反0
	char *b = v.data();	//将v转变为char数组,适用于转换为字符数组
	for(vector<char>::iterator it=v.begin();it<v.end();it++)
        temp.push_back(*it);
    cout << v[3] << endl;	//直接通过中括号索引
    v[3] = 'b';				//也可以用来赋值
    cout << v.at(3) << endl;	//这也一样可以用于读取,但是不能赋值
	v.clear();			//清空v内数据,不会更改v的地址,也不会更改v的最大容量
	v.assign(10, 'a');		//从第一个开始替换为10个a,其他位置不变;如果位数不够,添加位数
	v.front();				//第一个字符
	v.front() = 'a';		//也可用于赋值
	v.back();				//一样
	v.back() = 'a';
	v.push_back('a');		//从最后面插入数
	v.pop_back();			//删除最后一个数
    v.capacity();			//获取v的最大容量(系统为它分配的大小)
//注意下面的位置不是输入的数字索引,而是position,如v.begin()、6v.end()、v.begin()+5
	v.erase(pos);		//删除pos位置的数据,传回下一个数据的位置。
	v.erase(beg,end);	//删除[beg,end)区间的数据,传回下一个数据的位置。

2、list

list是双向链表,在操作中没有[]或者at()函数可以观察,只能通过迭代器实现数据的遍历

	list<int>::iterator opt;
    for(opt = l.begin();opt != l.end(); opt++)
        cout << *opt;
	l.insert(l.begin(),9);			//开头处插入一个9
	l.insert(l.begin(),2 ,9);		//开头处插入2个9
	l.insert(l.begin(),list.begin(),list.begin()+5);	//把list表中前6个数据插入到l的开头
	l.erase(l.begin());		//删除开头1个数据
	l.sort();			//内部排序
	swap(l1,l2);		//两个表互换
	l1.swap(l2);		//等价
	l.merge(l1);		//l1合并到l中,l1在l后,并且清空l1
	l.merge(l1,greater<int>());	//l1合并到l中,l1在l前,并且清空l1

push_back() 和front()和back()等函数和vector里都一样,只是list里多了个push_front()

3、deque

构造函数和前面的统一

可从头尾双方面存取数据

成员函数略

4、set

	insert();				//插入数据
	begin();				//返回set容器的第一个元素
	end();					//返回set容器的最后一个元素
	clear();				//删除set容器中的所有的元素
	empty();				//判断set容器是否为空
	max_size();				//返回set容器可能包含的元素最大个数
	size();					//返回当前set容器中的元素个数
	rbegin();				//返回的值和end()相同
	rend();					//返回的值和rbegin()相同
	count();				//用来查找set中某个某个键值出现的次数
	erase(iterator);		//删除定位器iterator指向的值
	erase(first,second);	//删除定位器first和second之间的值
	erase(key_value);		//删除键值key_value的值
	find();					//寻找值
	lower_bound(key_value);	//返回第一个大于等于key_value的定位器
	upper_bound(key_value);	//返回最后一个大于等于key_value的定位器

5、map

map与前面的不一样,它是一个一对一的容器,即key——value,根据key值,可快速访问value。

由于格式不同,所以一些操作方法也不同。

// 第一种 用insert函數插入pair
m.insert(pair<int, string>(1, "a"));
 
// 第二种将同种map类型数据插入
m.insert(map<int, string>::value_type(2, "b"));
 
// 第三种 用数组方式插入
m[3] = "c";

//输出直接套用数组模版
cout << m[2] << endl;

6、stack

栈的功能不解释,它主要是三个函数构成功能

	stack<char> s;				//定义一个char类型栈
    s.push('h');				//进栈一个元素
    cout << s.top() << endl;	//输出栈顶元素
    s.pop();					//删除栈顶元素

    s.empty();					//是否为空
    s.size();					//栈内元素个数

7、queue

队列和栈的用法大致相当

	q.push('c');				//进队
    cout << q.front() << endl;	//输出队前元素
    q.pop();					//删除队前元素
    q.empty();					//是否为空
    q.size();					//队列元素个数

三、迭代器(*/iterator)

STL有5种迭代器:

  1. 正向迭代器(forward iterator)
  2. 双向迭代器(bidirectional iterator)
  3. 随机访问迭代器(random access iterator)
  4. 输入迭代器(input iterator)
  5. 输出迭代器(output iterator)

使用方法:

1、*——指针类型

如代码:

#include <iostream>
#include <algorithm>
using namespace std;

int a[10];

int main(int argc, const char * argv[]) {
    
    a[6]=500;
    
    int *ite = find(a, a+sizeof(a)/sizeof(int), 500);
    if(ite == a+sizeof(a)/sizeof(int))				//ite到尾端
        cout << "not found";
    else
        cout << *ite << " was found";
    
    cout << endl;
    return 0;
}

使用的常用的指针类型,定义一个int类型指针,使用find函数,将数组中找到的地址赋给指针,所以直接拜访指针即可.

并且迭代器指针是可以直接修改数组内部值的!

2、容器中的迭代器(iterator)

如代码:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int main(int argc, const char * argv[]) {
    
    vector<int> v(10,5);
    v[5] = 50;
    vector<int>::iterator ite;
    
    ite = find(v.begin(), v.end(), 50);
    
    if(ite == v.end())
        cout << "not found";
    else
        cout << "found";
    
    cout << endl;
    return 0;
}

注意,end成员函数返回的是v的最后一个元素后一个位置,也就是说直接访问end是一个位置数字,但是访问end-1即是v中最后一元素。

3、常量迭代器

在前文介绍的迭代器iterator是可进行直接赋值的,那么对v或数组来说就不安全。所以引入了常量迭代器const_iterator。它的用法和iterator一样,只是,它是只读迭代器。

	vector<int>::const_iterator con_ite;

四、string类型

string是最主要也是最重要的一种容器,单独列开单独讨论!

同样的,using namespace std;


赋值

	string s;
	string s("hello");
	cin >> s;

大小

	s.size();
	s.length();		//都是计算大小
	s.empty();		//查看是否为空
	s.capacity();		//重新分配内存前的最大存储个数

检索

	s[3] = 's';
	s.at(3) = 's';		//等价

比较 =0时相等,>0时表示大于,<0时表示小于

	string s("abcd");
	s.compare("abcd");		//0
	s.compare("dcba");		//<0
	s.compare("ab");		//>0
	s.compare(s);			//=0
	s.compare(0,2,s,2,2);	//<0 ab?cd
	s.compare(1,2,"bcx",2);	//<0 bc?bc

修改内容

	s.assign(str);					//str赋给s
	s.assign(str,1,3);				//把str的1索引位置后的3个字符赋给s
	s.assign(str,2,string::nopos);	//把str的2-end赋给s
	s.assign("IBM");				//字符串赋给s
	s.assign("sony",5);				//把sony以及\0赋给s
	s.assign(5,'x');				//5个x赋给s

删除

	s="";
	s.clear();
	s.erase();			//全删
	s.erase(1,2);		//删除1索引后的两个字符
	s.erase(1);			//删除1索引后的所有字符

尾端添加

	s+=str;							//把str加到s后
	s+="hello";						//把“hello”加到s后
	s+='a';							//把‘a’加到s后
	s.append(str);					//同s+=str
	s.append(str,1,3);				//将str的1-3索引字符加到s中
	s.append(str,2,string::npos);	//将str的2-end索引字符加到s中
	s.append("hello");				//同s+="hello";
	s.append("hello",3);			//把“hello”的前三个字符加到s后
	s.append(5,'x');				//把5个‘x’加到s后
	s.push_back('a');				//s后加入一个字符‘a’

插入

	s.insert(1,"hello");		//在1位置插入“hello”
	s.insert(2,str);			//在2位置插入str

替换

	s.replace(3,2,"hello");		//替换3索引后的2个字符为“hello”

提取子串

	s.substr();				//提取s的全部内容
	s.substr(11);			//提取索引11往后的字符子串
	s.substr(5,6);			//提取5索引后的6个字符子串

查找

	string s("hello world!\nGood Morning!");
	s.find("world");				//返回s中str的索引,如果不存在,返回一个超大值;返回6
	s.find_first_of("world!")		//返回“world!”中任意字符出现的最早位置;返回2
	s.find_last_of("world");		//与上一条相反;返回25
	s.find_first_not_of("help!")	//返回“help!”中没有出现的第一个字符位置;返回4
	s.find_last_not_of("help!")		//与上一条相反;返回24


记住这些关键字:find、substr、append、push_back、assign、compare。

五、算法

C++ 库函数大全

在使用算法时,头文件为#include <algorithm>

提供给我们的函数接口太多了,仅写一些常用的。

成员函数:

1. find()

模版:template <class _InputIterator, class _Tp>

_InputIterator
find(_InputIterator __first, _InputIterator __last, const _Tp& __value_);

2. min()、max()

模版:template <class _Tp>

const _Tp&
min(const _Tp& __a, const _Tp& __b)

const _Tp&
max(const _Tp& __a, const _Tp& __b)

3.sort()

模版:template <class _Tp>

void
sort(_Tp** __first, _Tp** __last)

4.merge()

模版:template <class _InputIterator1, class _InputIterator2, class _OutputIterator>

_OutputIterator
merge(_InputIterator1 __first1, _InputIterator1 __last1,
      _InputIterator2 __first2, _InputIterator2 __last2, _OutputIterator __result)

5.binary_search()

模版:template <class _ForwardIterator, class _Tp, class _Compare>

bool
binary_search(_ForwardIterator __first, _ForwardIterator __last, const _Tp& __value_, _Compare __comp)

。。。。。。

4个排序算法:sort(),partial_sort(),partial_sort_copy(),stable_sort()
4个二分查找算法:binary_search(),lower_bound(),uper_bound(),equal_range()
2个用于合并有序区间的通用算法:
merge(),inplace_merge()
4个最值算法:
min(),max(),min_element(),max_element()
3个与排列方式有关的算法:lexicographical_compare(),next_permutation(),prev_permutation()
5个用于有序序列上的集合操作算法:includes(),set_union(),set_intersection(),set_difference(),set_symmetric_difference()
4个为堆创建和操作的算法:make_heap(),pop_heap(),push_heap(),sort_heap()

基于AOD-Net与GAN的深度学习去雾算法开发 本文提出一种结合AOD-Net与GAN的深度学习去雾算法。通过改进的AOD-GAN网络架构,集成风格迁移模块,设计包含对抗损失、内容损失和风格损失的复合目标函数。实验表明,该方法在PSNR(24.67)、SSIM(0.92)和FID(32.15)指标上优于传统方法,实现了端到端的物理模型引导图像去雾。未来将优化多尺度特征融合和轻量化部署。 阅读详情

相关推荐

四旋翼无人机Matlab建模

本文主要分享一下四旋翼无人机的建模过程,然后在Matlab的simulink模块搭建起四旋翼无人机的模型,下一章将结合这个模型设计双环PID控制器并调节参数。 一、无人机建模过程

qq_36903625的博客 3万+

STL源码剖析——deque的实现原理和使用方法详解

Deque 简介 deque是“double—ended queue”的缩写,和vector一样都是STL的容器,deque 是双端数组,而 vector 是单端的。 deque 在接口上和 vector 非常相似,在许多操作的地方可以直接替换。 deque 可以随机存取元素(支持索引值直接存取,用[]操作符或at()方法,这个等下会详讲)。 deque 头...

taoqick的专栏 855

AI 编程新范式:一文彻底搞懂 LLM、Agent、MCP、Skill 是怎么协作的

本文用通俗易懂的方式解析了AI编程新架构的核心概念。通过"三国演义"类比,文章将复杂的技术架构拆解为:Agent(军师/大脑)负责思考和决策,Skill(招式/手脚)执行具体操作,MCP(令箭/协议)作为通信标准,MCP Server(将军/身体)承载多个Skill。这套分工架构使AI从单纯聊天进化成能完成实际编程任务的全能助手,实现了关注点分离——Agent专注智能提升,Skill专注功能实现,MCP确保稳定连接。这正是Cursor、Claude等新一代AI开发工具采用的核心架构,标志

猫老板的豆 3080

C++deque的使用

一、背景介绍 所谓的deque是”double ended queue”的缩写,双端队列不论在尾部或头部插入元素,都十分迅速。而在中间插入元素则会比较费时,因为必须移动中间其他的元素。双端队列是一种随机访问的数据类型,提供了在序列两端快速插入和删除操作的功能,它可以在需要的时候改变自身大小,完成了标准的C++数据结构中队列的所有功能。它不像vector一样把所有对象保存在一个连续的内存块,而是多个连续的内存块。并且在一个映射结构中保存对这些块以及顺序的跟踪。 二、deque和vector的不同之处

sinat_31608641的博客 3523

手把手教你用Deep Single-Image Portrait Relighting实现人像光影重塑(附GitHub代码)

本文提供了一份详细的实战指南,手把手教你利用Deep Single-Image Portrait Relighting技术实现人像光影重塑。文章从环境搭建、核心原理拆解出发,逐步指导构建简易重光照流程,并探讨了使用预训练模型进行效果优化的进阶方法,最后附上避坑指南与常见问题排查,帮助开发者快速上手这一AI图像处理技术。

weixin_29065015的博客 316

浅谈一下小波变换和EEG信号处理

浅谈小波变换,总结不是很到位,请大家指正。

qq_45045249的博客 2862

java中的双端队列deque使用以及部分原理

转载自:https://www.cnblogs.com/denglh/p/7911513.html package collections; import java.util.Deque; import java.util.LinkedList; /** * @Package collections * @date 2017-11-28下午5:53:32 */ public class ...

胖墩的IT博客 2846

嵌入式Linux网络调试踩坑记:YT8531/YT8521 PHY驱动移植与设备树配置实战

本文深入解析嵌入式Linux系统中YT8531/YT8521 PHY驱动移植与设备树配置的实战经验。从网络不通的常见现象入手,详细介绍了驱动移植关键点、设备树配置详解及常见问题排查技巧,帮助开发者快速解决RGMII接口调试难题,提升嵌入式网络开发效率。

weixin_42525328的博客 445

java Deque用法

jiayou

utangkel的博客 586

【AI理论学习】深入理解扩散模型:Diffusion Models(DDPM)(理论篇)

继OpenAI在2021提出的文本转图像模型之后,越来越多的大公司卷入这个方向,例如谷歌相继推出了和。一些主流的文本转图像模型,例如,和采用了扩散模型()作为图像生成模型,这也引发了对扩散模型的研究热潮。与GAN相比,扩散模型训练更稳定,而且能够生成更多样的样本,OpenAI的论文也证明了

小哲的博客 5213

整理 钢琴 约翰·汤普森现代钢琴(大汤)

大汤

TS的博客 3999

双端列表 —— Deque 接口概述,使用ArrayDeque实现队列和双端队列数据结构

​ Deque译为双端队列,在双向都能作为队列来使用,同时可用作栈。Deque接口的方法是对称成比例的。Deque接口继承Queue接口,因此具有Queue,Collection,Iterable的方法属性。

weixin_62458944的博客 2153

EZ-INSAR工具箱(使用历史问题)

把 rasterio 升到 1.3+(或退回 py39)→features能 import → 脚本能跑 → 出图 → MATLAB 不再报错!

2301_79258000的博客 121

#include <algorithm>

adjacent_find :在 iterator 对标志的元素范围内,查找一对相邻的重复元素,如果找到返回一个 ForwardIterator ,指向这对元素的第一个元素。find_first_of :在范围内查找“由输入的另外一个 iterator 对标志的第二个序列”中的任意一个元素的第一次出现。nth_element :将范围内的序列重新排序,使所有小于第 n 个元素的元素都出现在它前面,而大于它的都出现在后面,重载版本使用了自定义的比较操作。重载版本用指定的二元操作计算相邻元素的差。

NOIP1ding_c的博客 1032

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

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

头文件#include algorithm

#include:algorithm意为"算法",是C++的标准模版库(STL)中最重要的头文件之一,提供了大量基于迭代器的非成员模版函数。 非修改性序列操作(12个) 循环 对序列中的每个元素执行某操作 for_each() 查找 在序列中找出某个值的第一次出现的位置 find() 利用底层元素的等于操作符,对范围内的元素与输入的值进行比较。当匹配时,结束搜索,返回该元素的一个 Inpu...

weixin_43869906的博客 1248

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

2019.1.5

2019.1.4 主要进行了: 1.TCP/IP复习 2.ACM step1.3.7 algorithm意为"算法",是C++的标准模版库(STL)中最重要的头文件之一,提供了大量基于迭代器的非成员模板函数 ...

gw_csdn的博客 149

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C++ STL标准库:算法algorithm

文章目录1. 简介2. 非修改序列算法3. 修改序列算法4. 划分、排序算法5. 堆算法 algorithm- C++ Reference (cplusplus.com) 1. 简介 STL的设计是将数据和算法独立开来,允许任何算法和任何容器交互。 算法对容器中数据进行操作。 容器用来存放数据。 迭代器则是算法与容器之间的桥梁。 分类: 非修改序列算法 指不直接修改所操作的容器内容的算法。 修改序列算法 指可以修改所操作的容器内容的算法。 划分、排序、合并 包含对序列进行划分排序和合并的算法

超级大洋葱的博客 5418

csp信奥赛C++学习者的有力工具:标准模版库!掌握STL,助力你顺利AK一等奖!

csp信奥赛C++学习者的有力工具:标准模版库!掌握STL,助力你顺利AK一等奖!

王老师青少年编程 2302

C++ algorithm函数简介(详细)

algorithm意为"演算法",是C++的标准模版库(STL)中最重要的头文件之一,提供了大量基于迭代器的非成员模版函数,库中的算法主要分为4类: 非修改性顺序操作(Non-modifying sequence operations) 可变顺序操作(Mutating sequence operations) 排序和关系操作(Sorting and related operations) C库算法(C library algorithms) 1.非修改性顺序操作(12个) 循环:对序列中.

qq_38251358的博客 8719

【C/C++】C++ 标准模版库(STL)

本文为 C++ 标准模版库的学习总结。

weixin_44413191的博客 359

c++ algorithm 函数简介

algorithm编辑 algorithm意为"演算法",是C++的标准模版库(STL)中最重要的头文件之一,提供了大量基于迭代器的非成员模版函数。 编程语言C++ 类    别C++标准库 头文件#include 命名空间using namespace std; 目录 1函数 ? 不修改内容的序列操作: ? 修改内容的序列操作: ? 划分操作: ? 排序操作: ? 二分

my_lord 2万+

STL标准模版库之算法(algorithm)

STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。 STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于传统的由函数和类组成的库

nihao_2014的博客 783

C++ 常用函数汇总#include<algorithm>

include 是C++的标准模版库(STL)中最重要的头文件之一,提供了大量基于迭代器的非成员模板函数。具体包括:非修改序列操作、修改序列操作、分区操作、排序操作、二分查找操作、合并操作、堆操作、最大最小值操作、其它操作本文详细记录该库中函数的使用方法及常用函数的解释

Gary_ghw的博客 1万+

C++中的algorithm 的头文件

#include

weixin_73796066的博客 3001

STL algorithm算法集合

algorithm意为"演算法",是C++的标准模版库(STL)中最重要的头文件之一,提供了大量基于迭代器的非成员模版函数。 编程语言 C++ 类    别 C++标准库 头文件 #include 命名空间 using namespace std; 目录

roaylchen的博客 2712

algorithm头文件常用函数

algorithm意为&quot;算法&quot;,是C++的标准模版库(STL)中最重要的头文件之一,提供了大量基于迭代器的非成员模板函数。 类 别 C++标准库 头文件 #include &amp;lt;algorithm&amp;gt; 命名空间 using namespace std 其中包括以下部分函数: max()、min()和abs() swap() reverse() next_permutation...

zm_960810的博客 1万+
上一篇: Qt计时器的使用
下一篇: C++基本类型互转(string、char[]、int)
巨蟹贼香
博客等级 码龄9年 76粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值