模板初阶和string容器

目录

1.模板

函数模板

函数模板的调用规则:

类模板 

 容器与迭代器

string的简单介绍

iterator(迭代器)

begin()与end()

rbegin()和rend()

 Capacity(容量)

shrink_to_fit()

Element access(获取字符串中的元素)

Modifiers(修改字符串)

String opertations 

其他 


1.模板

什么是模板?模板能有什么用?

比如,你想写一个函数处理一些不同类型的数据,虽然数据的类型不同,但函数中处理数据的方法是一致的。如果不应用模板,那么就需要根据处理的数据类型写相应的仅仅只是参数类型不同的函数。

可以通过模板来实现泛式编程,大大减少程序中冗余的代码。

函数模板

例子:

int add(int a, int b)
{return a + b;
}double add(double a, double b)
{return a + b;
}int main()
{int a = 1;int b = 2;double c = 2.1;double d = 2.3;add(a, b);add(c, d);return 0;
}

向要实现数据的加减,但加减的数据的类型多种多样需要写处理相应数据类型的函数,代码很容易冗余。

这是后就需要使用模板,

template<class T>
T add(T a, T b)
{return a + b;
}

template是关键字,说明下面你写的一段代码是个模板

T是模板参数,如果你调用该函数时传的是int类型的数据,那么编译器会将T推导出来为int,并生成相应的参数为int,返回值为int的函数。

template<class T>
T add(T a, T b)
{cout << sizeof(T) << endl;return a + b;
}int main()
{int a = 1;int b = 2;double c = 2.1;double d = 2.3;add(a, b);add(c, d);return 0;
}

多模板参数

template<class T1,class T2>
//.......

函数模板的调用规则:

1.如果要处理的数据类型已经有实现的函数,那么就不会使用模板

int add(int a, int b)
{cout << "已存在的处理int" << endl;return a + b;
}double add(double a, double b)
{cout << "已存在的处理double" << endl;return a + b;
}template<class T>
T add(T a, T b)
{cout << "模板函数" << endl;return a + b;
}int main()
{int a = 1;int b = 2;double c = 2.1;double d = 2.3;add(a, b);add(c, d);return 0;
}

2. 如果没有现成的函数就使用模板生成一个该类型的模板

	float e = 1.1;float f = 1.2;add(e, f);

3.如果传的参数无论是与已有函数还是模板参数(表面上(只看数据类型不考虑隐式类型转换))都不匹配,那么就可能报一些错误无法正常运行。

	add(a, c);//传一个int,和一个double

如果调用的是已存在的函数,可能存在调用歧义的问题,以上的代码就有这个问题,因为我们实现了一个处理int的函数,一个处理double的函数。并且传的参数一个是int一个是double,如果将double强转为int那么就调用int函数,如果将int强转为double那么就调用double的函数,但不幸的是编译器无法确定强转的顺序的先后,所以有调用歧义,不能运行。

如果调用的是模板呢?

跟上面的解释差不多,无法确定是将int强转为double还是将int强转为double,所以模板无法推导出模板参数T的类型

解决方法:

就是确定对那个数据进行强制类型转换

	add(a, (int)c);//将double强转为intadd((double) a, c);//将int强转为double

类模板 

template<class T>
class A
{
private:T _a;
};
A<int> a;//用int模板实例化
A<double> b;//用double模板实例化

类模板如何实例化出相应的对象的?

类模板会生成相应的类,在通过类的构造函数初始化对象

 容器与迭代器

什么容器?什么又是迭代器?两者之间有什么关系?

容器(container):简单来说就是跟所学的数据结构一样,就是用来存储数据的。比如,顺序表,链表,堆等等。

迭代器(iterator):就是访问数据的工具

关系:迭代器可以用同一种方法来访问不同容器中的数据。

迭代器就是一个类似于指针的东西。

迭代器的底层也是一个类,但string和vector容器的iterator可能是指针。

迭代器的取值范围是左闭右开

迭代器的使用

	string s = "hello world";for (string::iterator it = s.begin(); it != s.end(); it++){cout << *it;}

这个现在不懂没关系,下面会讲到。

string的简单介绍

链接:可以看更详细的使用说明

string - C++ Reference (cplusplus.com)

string是字符串类型

string的底层是一个类。

string姑且算一种容器吧,在C语言中没有string类型,但又字符数组就跟string差不多。

iterator(迭代器)

begin()与end()

begin返回string的起始迭代器

end返回string的结尾的迭代器

可以把返回值理解成类似于指针的东西。

使用:

int main()
{string s = "hello world";//第一种遍历一遍字符串for (string::iterator it = s.begin(); it != s.end(); it++){cout << *it;}cout << endl;//第二种遍历方式string::iterator it = s.begin();while (it != s.end()){cout << *it;it++;}cout << endl;//第三种遍历(范围for)for (auto e : s){cout << e;}return 0;
}

rbegin()和rend()

与begin()和end()不同的是rbegin()和rend(),返回值的类型不同,为反向迭代器reverse_iterator,

rbegin(),rend()begin(),end()
返回值类型reverse_iterator(反向迭代器)iterator
遍历方式从后往前遍历从前往后遍历

 Capacity(容量)

size():返回字符串的大小

length():跟size()的功能一样

capacity():返回容器的大小

max_size():返回能开辟的最大字符串的大小

resize()

改变字符串的size ,但如果想要改变后的大小大于容器的容量,那么就会先扩容,在改变字符的大小。

reserve()

可以扩容,但扩容只能往大的方向扩,如果你想扩容的大小小于等于原本容器的容量,那么就不会扩容。

 vs下的扩容:

	string s;int oldcapacity = s.capacity();cout << oldcapacity << endl;for (int i = 0; i < 1000; i++){s.push_back('a');int newcapacity = s.capacity();if (newcapacity != oldcapacity){oldcapacity = newcapacity;cout << newcapacity << endl;}}

 

由上图的代码和结果可知,容器的初始大小为15,之后差不多就是 1.5倍扩容。

 

clear()

将字符串变为一个空串(“”),但不改变容器的大小

empty()

判断该字符串是否是空串。

shrink_to_fit()

可以缩容,将容器缩小到适合字符串的大小可以减少不必要的空间浪费。

使用:

	string s = "hello world";cout << s.size() << endl;cout << s.length() << endl;cout << s.capacity() << endl;cout << s.max_size() << endl;//扩容s.reserve(100);cout << s.capacity() << endl;s.resize(20);cout << s.size() << endl;//清理字符串中的内容s.clear();cout << s << endl;//判空cout << s.empty() << endl;cout << s.capacity() << endl;//缩容s.shrink_to_fit();cout << s.capacity() << endl;

Element access(获取字符串中的元素)

operator[ ]:可以像数组一样通过[ ]访问字符串中的元素。

	string s("hello world");for (int i = 0; i < s.size(); i++){cout << s[i];}cout << endl;

at:获得指定位置的元素。

front:获得第一个元素。

back:获得最后一个元素。

Modifiers(修改字符串)

operator+= 

 在字符串之后追加字符串

	string s;s += "hello world";string s1 = "aaaa";s += s1;s += 'b';

append

在字符串之后追加字符串

append没有重载的+=好用 

第六个是模板,传的参数是迭代器。

assign :赋值

push_back

在字符串最后追加字符

	string s;s += "hello world";s.push_back('a');

insert:向指定位置的字符串中插入数据

erase:删除指定位置的字符

	string s("hello world");string::iterator it = s.begin();while (it != s.end()){cout << *it;s.erase(it);}

 

因为string的删除是,将指定位置后的字符都向前移动一位,所以不存在迭代器失效的问题。

replace:替换掉stringzhong指定的一段字符串

swap:交换两个字符串,这里的交换明面上交换的是字符串,实际上也交换了字符串的大小和容器的容量 

pop_back:删除字符串最后的元素。

String opertations 

c_str:返回字符串的首地址 

copy: 将字符串中的数据从pos位置开始拷贝len个字符进s指向的数组中。

 find:在字符串中找s指向的内容,并返回存在相应的位置。如果字符串中没有相应的内容,就返回 string::npos.

 

 string::npos 就是string类中的一个静态变量,因为是size_t 所以初始化为-1,npos的只就是size_t的最大值。

返回npos的意思就是找到字符串末尾也没找到相应的内容。

rfind:相较于find,rfing就是从后往前找。

find_first_of:找到第一个字符既在字符串中出现,又在s指向的内容中。

find_last_of:相较于find_first_of,其从后往前找

find_first_not_of:从字符串中,找第一个在不在s指向的内容中出现的字符,

find_last_not_of:从后往前找

substr:返回字符串中,从pos位置开始len长度的字符串。

compare:比较两或某段字符串的 大小

其他 

operator+:将左右字符串相加并返回一个新字符串(相加的结果)

lhs: left hand side(左操作数)

rhs:right hans side(右操作数)

 relational operators:两个字符串之间的关系运算。

swap(std中):这个std的swap会在交换前会发生字符串的拷贝,浪费性能。

void swap(string& x, string& y)
{string tmp = x;//tmp会拷贝构造x = y;y = x;
}

而string类中定义的swap不需要定义一个临时变量,直接就可以交换,效率更高。

重载的operator>> 和 operator<< 可以使流插入和流提取的对象直接为string类,跟方便使用。

getline可以从键盘中读入的字符插入字符串中 ,这里空格也可以读取,但operator>>不可以读取空格。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1472736.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

跨境人最怕的封店要怎么规避?

跨境人最怕的是什么&#xff1f;——封店 造成封店的原因很多&#xff0c;IP关联、无版权售卖、虚假发货等等&#xff0c;其中IP关联这个问题导致店铺被封在跨境商家中简直是屡见不鲜 IP关联&#xff0c;是指被海外平台检测到多家店铺开设在同一个站点上的情况。我们知道有些…

微服务框架Kratos学习笔记

环境配置 export GOPROXYhttps://goproxy.cn export GO111MODULEon go get -u github.com/go-kratos/kratos/tool/kratoskratos 工具安装完成 使用kratos命令创建新项目 kratos new kratos-demo看到这个提示&#xff0c;项目创建完成 go mod tidy 拉取项目依赖 生成所有pro…

卫星轨道平面简单认识

目录 一、轨道平面 1.1 轨道根数 1.2 应用考虑 二、分类 2.1 根据运行高度 2.2 根据运行轨迹偏心率 2.3 根据倾角大小 三、卫星星座中的轨道平面 四、设计轨道平面的考虑因素 一、轨道平面 1.1 轨道根数 轨道平面是定义卫星或其他天体绕行另一天体运动的平面。这个平…

python输出个人自我介绍

需求 使用input()函数从键盘输入姓名、年龄&#xff0c;座右铭&#xff0c;并使用print()函数输出到控制台 nameinput(请输入您的姓名&#xff1a;) ageinput(请输入您的年龄&#xff1a;) mottoinput(请输入您的座右铭&#xff1a;) print(------------自我介绍------------…

WAIC上官宣!大模型语料提取工具MinerU正式发布,开源免费“敲”好用

7月4日&#xff0c;2024 WAIC科学前沿全体会议在上海世博中心红厅隆重举行。上海人工智能实验室与商汤科技联合香港中文大学和复旦大学正式发布新一代大语言模型书⽣浦语2.5&#xff08;InternLM2.5&#xff09;&#xff0c;同时全链条工具体系迎来重磅升级&#xff0c;对于大模…

【hive】数据采样

参考https://hadoopsters.com/how-random-sampling-in-hive-works-and-how-to-use-it-7cdb975aa8e2&#xff0c;可以直接查看原文&#xff0c;下面只是对原文进行概括和实际性能测试。 1.distribute by sort by2.测试3.map端数据过滤优化采样 在说数据采样之前&#xff0c;需要…

空状态页面设计的艺术与科学

空状态界面是用户在网站、APP中遇到的因无数据展示而中断体验的界面&#xff0c;这个界面设计对于解决用户疑惑有着很大的帮助。那么我们应该如何设计空状态界面呢&#xff1f;空状态是指在界面设计中&#xff0c;没有内容或数据时所显示的状态。它可能出现在各种情况下&#x…

自动化测试报告pytest-html样式美化

最近我将 pytest-html 样式优化了 一版 先看优化前&#xff1a; 优化后&#xff1a; 优化内容包括&#xff1a; 删除部分多余字段新增echart图表部分字体大小、行间距、颜色做了美化调整运行环境信息移至报告最后部分字段做了汉化处理&#xff08;没全部翻译是因为&#xf…

劲爆!华为享界两款新车曝光,等等党有福了

文 | AUTO芯球 作者 | 雷慢 劲爆啊&#xff0c;北汽的一份环境影响分析报告&#xff0c; 不仅曝光了享界S9的生产进展&#xff0c; 还泄露了自家的另两款产品&#xff0c; 第一款是和享界S9同尺寸的旅行车&#xff0c; 我一看&#xff0c;这不是我最喜欢的“瓦罐”吗&…

基于docker环境及Harbor部署{很简短一点了,耐心看吧}

用到的环境&#xff1a; docker 、nacos、compose、harbor&#xff08;自行安装 ,以下连接作为参考&#xff09; nacos&#xff1a;史上最全整合nacos单机模式整合哈哈哈哈哈_nacos 源码启动 单机模式-CSDN博客 docker、compose、harbor:史上最全的整合Harbor安装教程&#…

Django自动生成Swagger接口文档 —— Python

1. 前言 当接口开发完成&#xff0c;紧接着需要编写接口文档。传统的接口文档通常都是使用Word或者一些接口文档管理平台进行编写&#xff0c;但此类接口文档维护更新比较麻烦&#xff0c;每次接口有变更&#xff0c;需要手动修改接口文档。在实际的工作中&#xff0c;经常会遇…

windows启动Docker闪退Docker desktop stopped

Windows启动Docker闪退-Docker desktop stopped 电脑上很早就安装有Docker了&#xff0c;但是有一段时间都没有启动了&#xff0c;今天想启动启动不起来了&#xff0c;打开没几秒就闪退&#xff0c;记录一下解决方案。仅供参考 首先&#xff0c;参照其他解决方案&#xff0c;本…

论文速览 | CVPR 2022 | Autofocus for Event Cameras | 首个事件相机自动对焦算法:让事件相机在黑暗中也能清晰成像

论文速览 | CVPR 2022 | Autofocus for Event Cameras | 首个事件相机自动对焦算法:让事件相机在黑暗中也能清晰成像 项目主页: https://eleboss.github.io/eaf_webpage/ 1 引言 在计算机视觉和机器人领域,事件相机因其高动态范围和低延迟的特性而备受关注。然而,事件相机的…

C++基础(六):类和对象(中-1)

上一篇博客&#xff0c;我们进入了面向对象的学习&#xff0c;知道了如何设计类&#xff0c;如何创建使用对象&#xff0c;这一篇博客我们再一次深入学习&#xff0c;这一节是类和对象的重点&#xff0c;其中的逻辑比较强&#xff0c;我们要深刻理解&#xff0c;消化&#xff0…

加密的三种方式(摘要加密、对称加密、非对称加密)

摘要加密 md5&#xff0c;sha1&#xff0c;sha256&#xff08;固定算法加密&#xff09; 摘要主要就是哈希值&#xff0c;通过我们的散列的算法。摘要的概念主要是验证完整性和唯一性&#xff0c;不管我们的密码是多长啊&#xff0c;或者多复杂的啊&#xff0c;得到的值都是固…

兴业小课堂|什么是法拍房助拍机构?如何挑选靠谱的助拍机构?

随着法拍房市场的不断发展和扩大 使法拍房数量的增加 其交易的复杂性和专业性需求也日益凸显 这促使了专门机构的出现来满足市场需求 法拍房助拍机构存在的原因主要有以下几点&#xff1a; 1.专业知识和经验&#xff1a; 法拍房的交易流程相对复杂&#xff0c;涉及到法律法…

鼠标自动点击器怎么用?鼠标连点器入门教程!

鼠标自动点击器是适用于Windows电脑的自动执行鼠标点击操作的工具&#xff0c;主要用于模拟鼠标点击操作&#xff0c;实现鼠标高速点击的操作。通过模拟鼠标点击&#xff0c;可以在用户设定的位置、频率和次数下自动执行点击动作。 鼠标自动点击器主要的应用场景&#xff1a; …

【电子数据取证】LX-A603互联网取证系统

文章关键词&#xff1a;电子数据取证、网站取证、快速固证 LX-A603可以通过简单的操作步骤&#xff0c;实现在符合规范的情况下自动对网站进行快速镜像、截屏固定、屏幕录像、生成报告等功能。满足了对互联网网站取证的实战化需求&#xff0c;极大提升工作效率。 应用场景1&a…

一个使用率超高的大数据实验室是如何练成的?

厦门大学嘉庚学院“大数据应用实训中心”&#xff08;以下简称“实训中心”&#xff09;自2022年建成以来&#xff0c;已经成为支撑“大数据专业”复合型人才培养的重要支撑&#xff0c;目前实训中心在专业课程实验教学、项目实训、数据分析类双创比赛、毕业设计等方面都有深入…

Ollama:本地大模型运行指南_ollama运行本地模型

Ollama 简介 Ollama 是一个基于 Go 语言开发的可以本地运行大模型的开源框架。 官网&#xff1a;ollama.com/ GitHub 地址&#xff1a;github.com/ollama/olla… Ollama 安装 【一一AGI大模型学习 所有资源获取处一一】 ①人工智能/大模型学习路线 ②AI产品经理入门指南 ③…