C++入门 -- 模板初阶与string简介

news2024/12/30 2:27:51

目录

模板:    

        函数模板

        类模板

STL简介:

string:

        string类对象的常见构造

        string类对象的容量操作

        string类对象的访问及遍历


模板:    

        在C语言阶段,当我们需要交换两个int类型的数据就需要写一个支持int类型交换的Swap函数,此函数并不能交换double类型的数据。

        现在我们学C++虽然函数模板可以解决,但是,重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数。

泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。模板分为函数模板与类模板。

函数模板:

函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定 类型版本。
//泛型编程
//模板

//函数模板
template<class T>  //template<typename T>  //模板参数列表 -- 参数类型
void Swap(T& x1, T& x2)  //函数参数列表 -- 参数对象
{
	T x = x1;
	x1 = x2;
	x2 = x;
}

int main()
{
	int a = 0, b = 1;
	double c = 1.1, d = 2.22;
	Swap(a, b);
	Swap(c, d);

	return 0;
}

        函数模板本身不是函数,在使用的时候编译器会推演出相应的函数。在编译器编译阶段,编译器根据传入的实参类型来推演生成对应类型的函数以供 调用。当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然 后产生一份专门处理double类型的代码。

函数模板的实例化:

用不同类型的参数使用函数模板,称为模板实例化,(可以手动实例化)。

template<class T>
T Add(const T& left, const T& right)
{
	return left + right;
}

int main()
{
	int a1 = 20, a2 = 30;
	double b1 = 10.1, b2 = 10.2;
	cout << Add(a1, a2) << endl;
	cout << Add(b1, b2) << endl;

	//显示实例化
	cout << Add<int>(a1, b2) << endl;
	cout << Add<double>(a1, b2) << endl;

	return 0;
}

当然,不同类型参数也是可以的

template<class T1, class T2>
T2 Add(const T1& left, const T2& right)
{
	return left + right;
}

int main()
{
	int a1 = 10, a2 = 20;
	double d1 = 10.1, d2 = 20.12;

	cout << Add(a1, d2) << endl;

	return 0;
}

类模板:

当我们用C语言实现栈的时候,我们写一份栈的数据结构,但是如果别的类型想用这个栈,就需要重新实现一份。类模板就很好得解决了这一问题。

//类模板
//Stack  类名
//Stack<T>  类型
template<class T>
class Stack
{
public:
	Stack(int capacity = 4)
		:_top(0)
		, _capacity(capacity);
	{
		_a = new T[capacity];
	}

	~Stack()
	{
		delete[] _a;
		_a = nullptr;
		_capacity = _top = 0;
	}

	void Push(const T& x);

private:
	T* _a;
	int _top;
	int _capacity;
};

template<class T>
void Stack<T>::Push(const T& x)
{
	//...
}

int main()
{
	Stack<int> st1;          //存储int
	Stack<double> st2; 

	st1.Push(1);
	st1.Push(2);
	st1.Push(3);

	return 0;
}

我们需要注意的是,单独的Stack是类名,Stack<T>才是类型。

STL简介:

STL(standard template libaray-标准模板库 ) C++ 标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
STL的版本有:原始版本(HP实验室研发),P.J.版本,RW版本,SGI版本。
下面就是我们熟知的六大组件。

string:

标准库中的string类:是表示字符串的字符串类。使用时要包含头文件和std。

string类对象的常见构造

                               string()
构造空的string类对象,即空字符串
                      string(const char* s)
用C-string来构造string类对象
                    string(size_t n, char c)
string类对象中包含n个字符c
                    string(const string&s)
拷贝构造函数

//编码   值  符号 建立映射关系  -- 编码表
//ascii编码表  --  英文
//unicode  -- 全世界文字  utf-8  utf-16  utf-31
//gbk  -- 中国

//char
//wchar_t
int main()
{
	cout << sizeof(char) << endl;         //1
	cout << sizeof(wchar_t) << endl;      //2
	
	return 0;
}

#include <string>

int main()
{
	string s1;
	string s2("hello world");
	string s3(s2);

	//cin >> s1;
	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;

	string s4(s2, 2, 6);      //从第二个向后拷6个
	cout << s4 << endl;

	string s5(s2, 2);         //从第二个拷到最后
	cout << s5 << endl;

	string s6(s2, 2, 100);     //不全的话也拷到结束
	cout << s6 << endl;

	string s7("hello world", 3); //拷前3个
	cout << s7 << endl;

	string s8(10, '!');         //拷10个 !
	cout << s8 << endl;

	return 0;
}

string类对象的容量操作

size
返回字符串有效字符长度
length
返回字符串有效字符长度
capacity
返回空间总大小
empty
检测字符串释放为空串,是返回 true ,否则返回 false
clear
清空有效字符
reserve
为字符串预留空间 * *
resize
将有效字符的个数该成 n 个,多出的空间用字符 c 填充

string类对象的访问及遍历

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

库里面应该是这样的    可读可写
//char& operator[](size_t pos)
//{
//	assert(pos < _size);
//	return _str[pos];
//}

int main()
{
	string s1("hello world");
	cout << s1 << endl;

	for (size_t i = 0; i < s1.size(); ++i)
	{
		cout << s1.operator[](i) << " ";
		cout << s1[i] << " ";                    //读
	}
	cout << endl;

	for (size_t i = 0; i < s1.size(); ++i)
	{
		s1[i] += 1;                              //写
	}
	cout << s1 << endl;

	for (size_t i = 0; i < s1.size(); ++i)
	{
		s1.at(i) -= 1;                            //写
	}
	cout << s1 << endl;


	//s1[100]
	try
	{
		s1.at(100);
	}
	catch (exception& e)
	{
		cout << e.what() << endl;
	}

	return 0;
}
int main()
{
	string s1;
	s1.push_back('a');
	s1.append("bcd");
	cout << s1 << endl;

	s1 += ':';
	s1 += "hello world";
	cout << s1 << endl;

	return 0;
}

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

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

相关文章

如何使用ArcGIS Pro自动矢量化建筑

概述相信你在使用ArcGIS Pro的时候已经发现了一个问题&#xff0c;那就是ArcGIS Pro没有ArcScan&#xff0c;确实在ArcGIS Pro中Esri移除了ArcScan&#xff0c;没有了ArcScan我们如何自动矢量化地图&#xff0c;从地图中提取建筑等要素呢&#xff0c;这里为大家介绍另外一种方法…

可视化深度学习模型的方法/工具

介绍 可以使用 TensorBoard 来可视化深度学习模型。TensorBoard 是 TensorFlow 中的一个可视化工具,可以帮助您在训练期间和训练后可视化模型的训练曲线、模型结构、激活值和权值分布等信息。可以使用 TensorBoard 的命令行工具或在 Jupyter 笔记本中使用 TensorBoard magic …

【Linux】权限理解(粘滞位设置)

目  录1 权限的概念2 权限管理2.1 文件类型及其访问权限2.2 文件权限值的表示方法2.3 文件访问权限设置2.4 目录权限&#xff08;粘滞位&#xff09;1 权限的概念 所谓权限&#xff0c;实际上是对人的约束&#xff0c;在Linux中&#xff0c;是对普通用户的约束。一件事情&…

蓝桥杯嵌入式之 Keil 仿真与调试

这篇文章为大家讲解 蓝桥杯嵌入式的 Keil 仿真与调试 &#xff0c; 这在比赛和今后的工作中都是常用的。大家看完后一定会对此有一个深刻的认识。 文章目录前言一、调试器的准备工作&#xff1a;1.在 Keil uVision集成开发环境下&#xff0c;选择CMSIS-DAP Debugger调试器。2.在…

final关键字深入解析

final关键字特性 final关键字在java中使用非常广泛&#xff0c;可以申明成员变量、方法、类、本地变量。一旦将引用声明为final&#xff0c;将无法再改变这个引用。final关键字还能保证内存同步&#xff0c;本博客将会从final关键字的特性到从java内存层面保证同步讲解。这个内…

SpringBoot项目从18.18M瘦身到0.18M

一、前言 SpringBoot部署起来虽然简单&#xff0c;如果服务器部署在公司内网&#xff0c;速度还行&#xff0c;但是如果部署在公网&#xff08;阿里云等云服务器上&#xff09;&#xff0c;部署起来实在头疼&#xff1a;编译出来的 Jar 包很大&#xff0c;如果工程引入了许多开…

GAMES101作业6及课程总结(重点解决SAH扩展作业)

这次作业相对于作业5会麻烦一点点&#xff0c;而且框架相较于作业五的也麻烦了一点&#xff0c;当然作业的难点其实主要还是在扩展作业SAH那块。 目录课程总结与理解&#xff08;光线追踪&#xff09;框架梳理作业一&#xff1a;光线生成作业二&#xff1a;光线-三角形相交作业…

Neo4j图数据库 批量写入与查询

1 前言 1-1 简介 工作中需要对所有的实体数据进行存储构建实体知识图谱&#xff0c;为基于知识图谱的问答提供数据基础。选择使用Neo4j作为数据库进行存储。以下是关于Neo4j的简介。 1-2 任务背景 将处理好的实体数据(共计1100万)写入图数据库中&#xff0c;并且提供查询接口…

量子计算(二十):量子算法简介

文章目录 量子算法简介 一、概述 二、量子经典混合算法 量子算法简介 一、概述 量子算法是在现实的量子计算模型上运行的算法&#xff0c;最常用的模型是计算的量子电路模型。经典&#xff08;或非量子&#xff09;算法是一种有限的指令序列&#xff0c;或一步地解决问题的…

乐视--996、内卷、裁员环境下一朵“奇葩”

在2022.12.28日我们发表了一篇“为什么四天工作制才是企业良药&#xff0c;而非裁员”,大家认为四天工作制与我们的距离就像实现“一个小目标”一样&#xff0c;不太可能。这不他来了&#xff0c;乐视来了&#xff0c;他真的来了&#xff0c;“鸡毛真的上天了”。他来了他来了他…

SQL技巧:使用AVG()函数计算占比

计算方式对比 一般计算占比&#xff0c;比如转换率、留存率等&#xff0c;都是先分组求和再相除得到结果&#xff0c;但是在一定的条件下&#xff0c;可以直接使用AVG()求出百分比。 比如&#xff0c;要求统计报名转化率&#xff0c;报名转化率公式为转化率报名人数/浏览人数…

内核解读之内存管理(8)内存模型

文章目录基本的术语CONFIG_FLATMEM&#xff08;平坦内存模型&#xff09;稀疏的内存模型基本的术语 在介绍内存模型之前需要了解一些基本的知识。 1、什么是page frame&#xff1f; 在linux操作系统中&#xff0c;物理内存被分成一页页的page frame来管理&#xff0c;具体pa…

c++11 标准模板(STL)(std::deque)(八)

定义于头文件 <deque> std::deque 修改器 擦除元素 std::deque<T,Allocator>::erase iterator erase( iterator pos ); (1)(C11 前) iterator erase( const_iterator pos ); (C11 起) iterator erase( iterator first, iterator last ); (2)(C11 前) iterator …

即时编译助力人大金仓KES分析能力飞跃

随着数字化技术对各行各业的不断渗透&#xff0c;人大金仓在金融、能源、电信等行业逐步进入深水区&#xff0c;面临越来越多的核心类系统改造升级&#xff0c;这些系统不仅需要满足在线交易系统运行的高实时性要求&#xff0c;还需要保证高效分析能力以帮助客户进行业务决策。…

红米pro14笔记本系统故障怎么U盘重装系统?

红米pro14笔记本系统故障怎么U盘重装系统&#xff1f;今天和大家一起来分享如何使用U盘重装系统的方法分享。有用户的红米pro14笔记本系统出现了一些问题需要进行重新安装&#xff0c;那么今天我们就一起来分享看看怎么U盘重装系统的方法吧。 准备工作&#xff1a; 1、U盘一个&…

Java执行Linux命令死锁阻塞挂起,Runtime.getRuntime().exec阻塞卡死问题解决

1、前言&#xff1a; 最近在做一个需求需要调用linux下的ffmpeg来对处理视频&#xff0c;很简单的需求&#xff0c;我像往常一样写下如下的代码片段&#xff1a; Process process Runtime.getRuntime().exec(cmd); process.waitFor(); But当我运行代码时&#xff0c;发现代码执…

前端笔记 ---- document.execCommand 函数整理

1. 语法 使用语法 bool document.execCommand(aCommandName, aShowDefaultUI, aValueArgument)返回值 一个 Boolean &#xff0c;如果是 false 则表示操作不被支持或未被启用。 备注&#xff1a; 在调用一个命令前&#xff0c;不要尝试使用返回值去校验浏览器的兼容性 2. 参…

基于Vue和SpringBoot的宾馆管理系统的设计和实现

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发&#xff08;Vue、SpringBoot和微信小程序&#xff09;、系统定制、远程技术指导。CSDN学院、蓝桥云…

树形结构——红黑树

前言 在 JDK1.8 之后&#xff0c;HashMap 的底层是由数组、链表、红黑树来实现的&#xff0c;当数组长度到 64 的时候&#xff0c;或者链表长度到 8 的时候&#xff0c;会调用 treeifyBin 转换为红黑树实现。因为红黑树是小伙伴们面试的时候经常被考到的知识点&#xff0c;因此…

OSPF-MGRE实验

1.首先配ip [r6]int g 0/0/1 [r6-GigabitEthernet0/0/1]ip add 192.168.1.2 24 [r6-GigabitEthernet0/0/1]int g 0/0/0 [r6-GigabitEthernet0/0/0]ip add 192.168.2.2 24 [r6-GigabitEthernet0/0/0]int g 0/0/2 [r6-GigabitEthernet0/0/2]ip add 192.168.3.2 24 [r6-GigabitEt…