STL —— string(1)

news2024/9/21 8:02:06

目录

1. 模板

1.1 泛型编程

1.2 函数模板

1.2.1 函数模板概念

1.2.2 函数模板格式

1.2.3 函数模板的原理

1.2.4 显式实例化

1.2.5 模板参数的匹配原则

1.3  类模板

1.3.1 类模板定义格式

 1.3.2 类模板的实例化

2.  STL —— string类

2.1 STL 简介

2.2 标准库中的string类

2.2.1 string类的构造函数 

2.3 string类容量操作

2.4 遍历string类

2.4.1 operator[]

2.4.2 迭代器iterator

2.4.3 范围for


1. 模板

1.1 泛型编程

  • 当我们要实现两个元素交换的时候,由于不知道要交换什么类型的两个值,可能要写多个参数不同的重载函数,例如:
void Swap(int& left, int& right)
{
	int temp = left;
	left = right;
	right = temp;
}
void Swap(double& left, double& right)
{
	double temp = left;
	left = right;
	right = temp;
}
void Swap(char& left, char& right)
{
	char temp = left;
	left = right;
	right = temp;
}
  • 即使我们使用函数的重载能够实现函数的功能,但是这样写代码会显得比较冗余,那我们能不能写一个模板来让编译器帮我们生成代码呢?  答案是可以的。

1.2 函数模板

1.2.1 函数模板概念

  • 函数模板与函数参数类型无关,编译器不会直接调用模板,而是利用模板实例化出一个函数,然后在调用。

1.2.2 函数模板格式

  • 函数模板通常采用 template<typename T1, typename T2......>的形式,这里的 typename 可以换成 class,例如:
template <typename T>
void Swap(T& x, T& y)
{
	T t = x;
	x = y;
	y = t;
}

int main()
{
	int a1 = 10, a2 = 20;
	Swap(a1, a2);
	return 0;
}

1.2.3 函数模板的原理

  • 函数模板实际上是编译器检测你所传入的参数的类型,然后自动帮你生成一份函数,之后再调用。

1.2.4 显式实例化

  • 那如果我们传入的参数类型不同那该怎么办呢?比如:

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

int main()
{
	int a1 = 10, a2 = 20;
	double d1 = 1.1, d2 = 2.2;
	Add(a1, d1);
	return 0;
}

这个时候编译器会编译不通过,因为当你传入a1 的 时候,编译器自动会把 T 推演成 int 类型, 但是看到 double 又会把 T 推演成 double 类型,编译器不知道该听谁的,所以会报错,那该如何处理呢? 这里给出三种方法:

  1. 强制类型转换:
    template <class T>
    // 注意这里的第二个参数要加上const
    T Add(T& left, const T& right)
    {
    	return left + right;
    }
    
    int main()
    {
    	int a1 = 10, a2 = 20;
    	double d1 = 1.1, d2 = 2.2;
    	Add(a1, (int)d1);
    	return 0;
    }

    由于在强制类型转换的过程中会产生临时变量,并且临时变量具有常性,不可被修改,而且传的是引用,因此要加上const。

  2. 多加一个模板参数类型
    template <class T1, class T2>
    T2 Add(T1& left, T2& right)
    {
    	return left + right;
    }
    
    int main()
    {
    	int a1 = 10, a2 = 20;
    	double d1 = 1.1, d2 = 2.2;
    	Add(a1, d1);
    	return 0;
    }
  3. 显示实例化
    template <class T>
    // 这边的const也是类似的道理
    T Add(const T& left, const T& right)
    {
    	return left + right;
    }
    
    int main()
    {
    	int a1 = 10, a2 = 20;
    	double d1 = 1.1, d2 = 2.2;
    	Add<double>(a1, d1);
    	return 0;
    }

    显示实例化会强制编译器把 T 推演成某个类型,格式就例如:Add<double>(a1, d1);

1.2.5 模板参数的匹配原则

  • 一个模板和一个与模板同名的函数可以同时存在,并且模板也可以生成与这个函数参数类型相同的函数,但是如果存在同名函数,且参数类型和要传入的参数类型相同,会首先调用这个函数,如果想让编译器自己生成,就可以用显示实例化,例如:

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

int Add(int left, int right)
{
	return left + right;
}

int main()
{
	int a1 = 10, a2 = 20;
	Add(a1, a2);
	Add<int>(a1, a2);
	return 0;
}
  • 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板,例如:
// 专门处理int的加法函数
int Add(int left, int right)
{
	return left + right;
}

// 通用加法函数
template<class T1, class T2>
T1 Add(T1 left, T2 right)
{
	return left + right;
}
void Test()
{
	Add(1, 2); // 与非函数模板类型完全匹配,不需要函数模板实例化
	Add(1, 2.0); // 模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的Add函数
}
  •  模板函数不允许自动类型转换,但普通函数可以进行自动类型转换:
// 因为普通函数可以进行自动类型转换,因此不需要加上const
int Add(int left, int right)
{
	return left + right;
}

int main()
{
	int a1 = 10;
    double d2 = 20;
	Add(a1, d2);
	return 0;
}

1.3  类模板

1.3.1 类模板定义格式

  • template<class T1, class T2, ..., class Tn>

如下是实现简单的栈类型个类模板:

template<class T>
class Stack
{
public:
	Stack(int capacity)
		:_a(new T[capacity])
		,_top(0)
		,_capacity(capacity)
	{}

	void PushBack(const T& val)
	{
		//CheckCapacity()
		_a[_top++] = val;
	}
	~Stack()
	{
		delete[] _a;
		_top = _capacity = 0;
	}

private:
	T* _a;
	int _top;
	int _capacity;
};
  • 如果要声明定义分离的话,要加入模板参数列表
template<class T>
void Stack<T>::PushBack(const T& val)
{
	//CheckCapacity()
	_a[_top++] = val;
}


template<class T>
Stack<T>::Stack(int capacity)
	:_a(new T[capacity])
	, _top(0)
	, _capacity(capacity)
{}

 1.3.2 类模板的实例化

int main()
{
	Stack<int> st1(8);
	Stack<double> st2(4);
	return 0;
}

2.  STL —— string类

2.1 STL 简介

STL(Standard Template Library)是C++标准库中的一个重要组成部分,提供了丰富的通用数据结构和算法模板。STL的设计目标是提供可复用、高效和类型安全的组件,以便开发人员可以方便地处理各种常见的数据结构和算法问题。

STL主要由以下几个组件组成:

  1. 容器(Containers):STL提供了一系列的容器类模板,如 vectorlistdequesetmap等。这些容器类模板封装了常见的数据结构,如数组、链表、双向队列、集合和映射等,开发人员可以根据需要选择合适的容器来存储和组织数据。

  2. 算法(Algorithms):STL提供了一组常用的算法模板,如排序、查找、合并、删除、遍历等。这些算法可以用于不同的容器,并且具有高度的可组合性,开发人员可以将不同的算法组合在一起以实现复杂的操作。

  3. 迭代器(Iterators):迭代器是STL中用于遍历容器元素的对象,它提供了一种通用的访问方式,使得算法可以独立于容器进行操作。STL提供了多种类型的迭代器,包括输入迭代器、输出迭代器、正向迭代器、双向迭代器和随机访问迭代器,每种迭代器都具有不同的特性和功能。

  4. 函数对象(Function Objects):函数对象是可调用对象,可以像函数一样使用。STL中的算法可以接受函数对象作为参数,以实现不同的操作。STL提供了一些标准的函数对象,如谓词(Predicate)、函数适配器(Function Adapters)等,同时也支持自定义的函数对象。

  5. 分配器(Allocators):STL中的容器使用分配器来管理内存的分配和释放。分配器允许开发人员自定义内存管理策略,以满足特定的需求,如内存池分配器、定制的内存分配器等。

STL的设计理念是以泛型编程为核心,通过使用模板和参数化类型,提供通用的、可复用的组件。STL组件之间的协调和配合使得开发人员能够以更高的抽象层次进行编程,从而提高开发效率并降低代码复杂性。

使用STL可以使得C++开发人员能够更加专注于解决问题本身,而不必过多关注底层的数据结构和算法实现。STL已经成为C++编程中的重要工具和标准实践,广泛应用于各个领域的软件开发。

2.2 标准库中的string类

  •  cplusplus 网站给出的 string 底层的介绍:

string - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/string/string/

2.2.1 string类的构造函数 

  • cplusplus 网站给出的string类构造函数的介绍:

string::string - C++ Reference (cplusplus.com)icon-default.png?t=N7T8https://legacy.cplusplus.com/reference/string/string/string/

  • 对应的构造函数的用法:
  • 注意这里的 "<<" 和 ">>" 重载库中已经给出,所以可以直接用:
int main()
{
	string s0; // (1)
	string s1("hello world"); // (4)
	string s2(s1); // (2)
	string s3(s1, 5); // (3)
	string s4("hello world", 5); // (5)
	string s5(6, '#'); // (6)
	cout << s0 << endl;
	cout << s1 << endl;
	cout << s2 << endl;
	cout << s3 << endl;
	cout << s4 << endl;
	cout << s5 << endl;
	return 0;
}

2.3 string类容量操作

size返回字符串有效长度。 

2.4 遍历string类

2.4.1 operator[]

  • string类中已经把[]重载了,可以获取pos位置的元素。
  • string类中的容量操作有一个size,可以返回字符串有效字符长度。
  • begin() 和 end() 在迭代器中,begin获取第一个字符的迭代器,end获取最后一个字符下一个位置的迭代器。

int main()
{
	string s0; // (1)
	string s1("hello world"); // (4)
	string s2(s1); // (2)

	for (size_t i = 0; i < s2.size(); ++i)
	{
		cout << s2[i] << " ";
	}
	cout << endl;


	for (size_t i = 0; i < s2.size(); ++i)
	{
		s2[i]++;
	}
	cout << endl;

	for (size_t i = 0; i < s2.size(); ++i)
	{
		cout << s2[i] << " ";
	}
	cout << endl;
	return 0;
}

 

2.4.2 迭代器iterator

  • 迭代器的用法类似于指针,在string中可能使用[]比较方便,但是在 链表,二叉树等链式结构就得用迭代器了。
int main()
{
	string s0; // (1)
	string s1("hello world"); // (4)
	string s2(s1); // (2)
	string::iterator it = s2.begin();
	while (it != s2.end())
	{
		cout << *it << " ";
		++it;
	}
	it = s2.begin();
	while (it != s2.end())
	{
		*it += 5;
		++it;
	}
	cout << endl;
	it = s2.begin();
	while (it != s2.end())
	{
		cout << *it << " ";
		++it;
	}
	return 0;
}

2.4.3 范围for

int main()
{
	string s0; // (1)
	string s1("hello world"); // (4)
	string s2(s1); // (2)
	for (auto e : s2)
	{
		cout << e << " ";
	}
	return 0;
}

 

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

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

相关文章

地理信息数据处理-线面数据转化和数据合并(二)

需求 1.数据为LineString&#xff0c;需要转化为Polygon 2.数据为多个分散的线、面数据&#xff0c;需要转化为一条Multi类型数据 解决方案使用&#xff0c;arcgis转化工具。 需求1&#xff1a;线-面数据转化 1.在arcgis中选中对应图层&#xff0c; 然后在“数据管理工具-要…

pcl采样:随机采样

pcl 随机采样,实际上就是抽稀 头文件 代码 结果

阿里云2024最新优惠:WoSign SSL证书首购4折

阿里云SSL证书 2024 最新优惠来啦&#xff01;阿里云SSL证书新用户&#xff0c;wosign SSL证书低至4折&#xff0c;WoSign SSL提供全球信任RSA SSL证书和国密算法SM2 SSL证书&#xff01;阿里云官网官方优惠&#xff0c;需要开年采购SSL证书的用户抓紧申请这波优惠&#xff01;…

mybatis-flex入门体验(一)

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 个人IP&#xff1a;shigen 趁着下午的空闲时间&#xff0c;研究了一下mybatis-flex&#xff0c;看着对我还…

【php基础】输出、变量、布尔类型、字符串

php基础补充 1. 输出2.和"的区别3.变量3.1变量的命名规则3.2 两个对象指向同一个值3.3 可变变量 4.变量的作用域5. 检测变量6. 布尔类型7.字符串定义与转义8.字符串常用函数9.常量 1. 输出 echo: 输出 print: 输出&#xff0c;输出成功返回1 print_r(): 输出数组 var_dum…

HarmonyOS入门学习

HarmonyOS入门学习 前言快速入门ArkTS组件基础组件Image组件Text组件TextInput 文本输入框Buttonslider 滑动组件 页面布局循环控制ForEach循环创建组件 List自定义组件创建自定义组件Builder 自定义函数 状态管理Prop和LinkProvide和ConsumeObjectLink和Observed ArkUI页面路由…

【网络安全】CobaltStrike 使用

本文章仅用于信息安全学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若读者因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与作者无关。 Cobalt Strike是一款渗透测试神器&#xff0c;Cobalt Strike已经不再使用MSF而是作为单独的平台使…

如何避免OKR成为形式主义,真正发挥其作用?

OKR&#xff08;Objectives and Key Results&#xff09;作为一种目标管理方法&#xff0c;旨在通过设定明确的目标和可衡量的关键成果&#xff0c;帮助企业实现高效、精准的管理。然而&#xff0c;在实际应用中&#xff0c;许多企业却陷入了形式主义的泥潭&#xff0c;使OKR失…

1.什么是exchange的自签名证书?安装exchange后,默认生成的证书介绍?如何查看exchange的证书情况?命令是?

目录 1.exchange的自签名证介绍 2.如何查看exchange的证书&#xff1f; 3.默认生成证书介绍 第一张&#xff1a;Microsoft Exchange 第二张&#xff1a;Microsoft Exchange Server Auth Certificate 第三张&#xff1a;WMSVC 总结&#xff1a; 1.exchange的自签名证介绍…

JAVA 获取系统当前时间、时间格式互相转化工具类,2024百度Java岗面试真题收录解析

DateTimeFormatter ftf DateTimeFormatter.ofPattern(“yyyy-MM-dd HH:mm:ss”); LocalDateTime parse LocalDateTime.parse(strTime, ftf); return LocalDateTime.from(parse).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); } //通过LocalDateTime获取当…

CPP容器vector和list,priority_queue定义比较器

#include <iostream> #include <bits/stdc.h> using namespace std; struct VecCmp{bool operator()(int& a,int& b){return a>b;/*** 对于vector和list容器&#xff0c;这里写了&#xff1e;就是从大到小* 对于priority_queue容器&#xff0c;这里写…

YOLO改进模块出现的问题及改进方法

1.grid_sampler_2d_backward_cuda 在对YOLOv9进行改进的过程中&#xff0c;有的时候就会出现这种报错&#xff1a;RuntimeError: grid_sampler_2d_backward_cuda does not have a deterministic implementation&#xff0c;but you set torch.use_deterministic_algorithms(Tr…

【SpringSecurity】十七、OAuth2授权服务器 + 资源服务器Demo

文章目录 0、库表准备1、项目结构2、基于数据库的认证3、授权服务器配置4、授权服务器效果测试5、资源服务器配置6、其他授权模式测试6.1 密码模式6.2 简化模式6.3 客户端模式6.4 refresh_token模式 相关&#x1f4d5;&#xff1a;【Spring Security Oauth2 配置理论部分】 0、…

[C#]winformYOLO区域检测任意形状区域绘制射线算法实现

【简单介绍】 Winform OpenCVSharp YOLO区域检测与任意形状区域射线绘制算法实现 在现代安全监控系统中&#xff0c;区域检测是一项至关重要的功能。通过使用Winform结合OpenCVSharp库&#xff0c;并结合YOLO&#xff08;You Only Look Once&#xff09;算法&#xff0c;我们…

Docker之docker compose!!!!

一、概述 是 Docker 官方提供的一款开源工具&#xff0c;主要用于简化在单个主机上定义和运行多容器 Docker 应用的过程。它的核心作用是容器编排&#xff0c;使得开发者能够在一个统一的环境中以声明式的方式管理多容器应用的服务及其依赖关系。 也就是说Docker Compose是一个…

利用Jmeter工具对服务器,数据库进行性能监控,压测,导出性能测试报告

Jmeter是Apache基金会旗下的一款免费,开源,轻量级的性能测试工具,主要针对web应用程序客户端/服务器进行性能测试.它可以分别测试静态、动态资源(Java Servlet,CGI Scripts,Java Object,数据库和FTP服务器等),它可以通过线程组来模拟数个用户,在一段时间内同时登录服务器,数个用…

MySQL的基础操作与管理

一.MySQL数据库基本操作知识&#xff1a; 1.SQL语句&#xff1a; 关系型数据库&#xff0c;都是使用SQL语句来管理数据库中的数据。 SQL&#xff0c;即结构化查询语言(Structured Query Language) 。 SQL语句用于维护管理数据库&#xff0c;包括数据查询、数据更新、访问控…

【机器学习】基于蝴蝶算法优化的BP神经网络分类预测(BOA-BP)

目录 1.原理与思路2.设计与实现3.结果预测4.代码获取 1.原理与思路 【智能算法应用】智能算法优化BP神经网络思路【智能算法】蝴蝶优化算法&#xff08;BOA)原理及实现 2.设计与实现 数据集&#xff1a; 数据集样本总数2000 多输入多输出&#xff1a;样本特征24&#xff0c…

WAF是什么意思?waf防火墙部署方式

防火墙中的WAF是什么意思&#xff1f;WAF是Web Application Firewall的简称&#xff0c;即Web应用防火墙&#xff08;也称网站应用级入侵防御系统&#xff09;一种专门为Web应用提供保护的网络安全设备&#xff0c;工作在应用层&#xff0c;通过执行一系列针对HTTP/HTTPS的安全…

GraalVM详细安装及打包springboot、java、javafx使用教程(打包普通JAVA项目篇)

前言 在当前多元化开发环境下&#xff0c;Java作为一种广泛应用的编程语言&#xff0c;其应用部署效率与灵活性的重要性日益凸显。Spring Boot框架以其简洁的配置和强大的功能深受开发者喜爱&#xff0c;而JavaFX则为开发者提供了构建丰富桌面客户端应用的能力。然而&#xff…