STL常用容器(string容器)---C++

news2025/1/20 16:59:00

STL常用容器目录

  • 1.string容器
    • 1.1 string基本概念
    • 1.2 string构造函数
    • 1.3 string赋值操作
    • 1.4 string字符串拼接
    • 1.5 string查找和替换
    • 1.6 string字符串比较
    • 1.7 string字符存取
    • 1.8 string插入和删除
    • 1.9 string子串

在这里插入图片描述

1.string容器

1.1 string基本概念

本质:

  • string是C++风格的字符串,而string本质上是一个.
  • 头文件:

string和char * 区别:

  • char * 是一个指针;
  • string是一个类,类内部封装了char\char*,管理这个字符串,是一个char*型的容器。

特点:
string 类内部封装了很多成员方法:
例如:查找find,拷贝copy,删除delete 替换replace,插入insert;
string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责。

1.2 string构造函数

构造函数原型:

  • string(); //创建一个空的字符串 例如: string str;
  • string(const char* s); //使用字符串s初始化
  • string(const string& str); //使用一个string对象初始化另一个string对象
  • string(int n, char c); //使用n个字符c初始化

示例:

#include <string>
void test01()
{
	string s1;//创建空字符串,调用无参构造函数
	cout << "str1 = " << s1 << endl;
	
	//char* str2 = "Hello world!";//报错,系统默认"Hello world!"为const char*类型
	const char* str2 = "Hello world!";
	string s2(str2);//使用字符串str2初始化
	cout << "str2 = " << s2 << endl;

	string s3(s2);//调用拷贝构造函数
	cout << "str3 = " << s3 << endl;

	string s4(10, 'A');//使用10个字符A初始化成字符串
	cout << "str4 = " << s4 << endl;
}

在这里插入图片描述

1.3 string赋值操作

赋值的函数原型:

  • string& operator=(const char* s); //char*类型字符串 赋值给当前的字符串
  • string& operator=(const string &s); //把字符串s赋给当前的字符串
  • string& operator=(char c); //字符赋值给当前的字符串
  • string& assign(const char *s); //把字符串s赋给当前的字符串
  • string& assign(const char *s, int n); //把字符串s的前n个字符赋给当前的字符串
  • string& assign(const string &s); //把字符串s赋给当前字符串
  • string& assign(int n, char c); //用n个字符c赋给当前字符串

示例:

void test02()
{
	string str1 = "Hello world!";//char*类型字符串 赋值给当前的字符串
	string str2 = str1;//把字符串str1赋给当前的字符串
	cout << "str1 = " << str1 << endl;
	cout << "str2 = " << str2 << endl;

	string str3;
	str3 = 'A';//字符赋值给当前的字符串
	cout << "str3 = " << str3 << endl;

	string str4;
	str4.assign("Hello c++");//把字符串Hello c++赋给当前的字符串
	cout << "str4 = " << str4 << endl;

	string str5;
	str5.assign("Hello c++", 5);//把字符串Hello c++的前n个字符赋给当前的字符串
	cout << "str5 = " << str5 << endl;

	string str6;
	str6.assign(str5);//把字符串str5赋给当前字符串
	cout << "str6 = " << str6 << endl;

	string str7;
	str7.assign(5, 'X');//用5个字符X赋给当前字符串
	cout << "str7 = " << str7 << endl;
}

在这里插入图片描述

1.4 string字符串拼接

功能描述:

  • 实现在字符串末尾拼接字符串;

函数原型:

  • string& operator+=(const char* str); //重载+=操作符
  • string& operator+=(const char c); //重载+=操作符
  • string& operator+=(const string& str); //重载+=操作符
  • string& append(const char *s); //把字符串s连接到当前字符串结尾
  • string& append(const char *s, int n); //把字符串s的前n个字符连接到当前字符串结尾
  • string& append(const string &s); //同operator+=(const string& str)
  • string& append(const string &s, int pos, int n);//字符串s中从pos开始的n个字符连接到字符串结尾

示例:

void test03()
{
	//重载+=操作符
	string str1 = "千里";
	str1 += "之行"; //把字符串"之行"连接到当前字符串结尾
	cout << "str1 = " << str1 << endl;

	str1 += ',';//把字符','连接到当前字符串结尾
	cout << "str1 = " << str1 << endl;

	string str2 = "始于足下";
	str1 += str2;//把字符串"始于足下"连接到当前字符串结尾
	cout << "str1 = " << str1 << endl;

	    
	string str3 = "A thousand mile";
	str3.append(" trip ");//把字符串" trip "连接到当前字符串结尾
	str3.append("begins with you", 11);//把字符串"begins with you"前11个字符连接到当前字符串结尾
	string str = " one step.";
	//str3.append(str, 0, 10); // 从下标0位置开始 ,截取10个字符,拼接到字符串末尾
	str3.append(str);//效果同上,将str字符串拼接至末尾
	cout << "str3 = " << str3 << endl;
}

在这里插入图片描述
注意:对于用“ ”括住的本质是属于const char*类型的,但将其赋值给string类型时,其就变成了string类型。

1.5 string查找和替换

功能描述:

  • 查找:查找指定字符串是否存在;
  • 替换:在指定的位置替换字符串;

函数原型:

  • int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找(返回所在位置下标
  • int find(const char* s, int pos = 0) const; //查找s第一次出现位置,从pos开始查找
  • int find(const char* s, int pos, int n) const; //从pos位置查找s的前n个字符第一次位置
  • int find(const char c, int pos = 0) const; //查找字符c第一次出现位置
  • int rfind(const string& str, int pos = npos) const; //查找str最后一次位置,从pos开始查找
  • int rfind(const char* s, int pos = npos) const; //查找s最后一次出现位置,从pos开始查找
  • int rfind(const char* s, int pos, int n) const; //从pos查找s的前n个字符最后一次位置
  • int rfind(const char c, int pos = 0) const; //查找字符c最后一次出现位置
  • string& replace(int pos, int n, const string& str); //替换从pos开始n个字符为字符串str
  • string& replace(int pos, int n,const char* s); //替换从pos开始的n个字符为字符串s

示例:

void test04()
{
	//查找
	string str1 = "abcdefgde";//位置从0开始

	int pos = str1.find("de");//在str1中查找de,返回其第一次出现的位置

	if (pos == -1)//未找到返回-1
	{
		cout << "未找到" << endl;
	}
	else
	{
		cout << "pos = " << pos << endl;
	}

	pos = str1.rfind("de");//从右往左,在str1中查找de,返回其最后一次出现的位置
	cout << "pos = " << pos << endl;

	//替换
	string str2 = "abckkkxyz";
	str2.replace(3, 3, " vs ");//替换从3开始3个字符为字符串" vs "
	cout << "str2 = " << str2 << endl;
}

在这里插入图片描述
总结:

  • find查找是从左往后,rfind从右往左;
  • find找到字符串后返回查找的第一个字符位置,找不到返回-1;
  • replace在替换时,要指定从哪个位置起,多少个字符,替换成什么样的字符串。

1.6 string字符串比较

功能描述:

  • 字符串之间的比较

比较方式:

  • 字符串比较是按字符的ASCII码进行对比
  • = 返回 0
  • >返回 1
  • < 返回 -1

函数原型:

  • int compare(const string &s) const; //与字符串s比较
  • int compare(const char *s) const; //与字符串s比较

示例:

void test05()
{
	string s1 = "hello";
	string s2 = "aello";

	int ret = s1.compare(s2);//a和h的ASCII码值分别为97,104

	if (ret == 0) {
		cout << "s1 等于 s2" << endl;
	}
	else if (ret > 0)
	{
		cout << "s1 大于 s2" << endl;
	}
	else
	{
		cout << "s1 小于 s2" << endl;
	}
}

在这里插入图片描述

1.7 string字符存取

string中单个字符存取方式有两种:

  • char& operator[](int n); //通过[]方式取字符
  • char& at(int n); //通过at方法获取字符

示例:

void test06()
{
	string str = "hello world";

	//size()字符串中字符个数
	cout << str.size() << endl;

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

	for (int i = 0; i < str.size(); i++)
	{
		cout << str.at(i) << " ";
	}
	cout << endl;

	//字符修改
	str[0] = 'x';//修改为xello world
	str.at(1) = 'x';//修改为xxllo world
	cout << str << endl;
}

在这里插入图片描述
总结:string字符串中单个字符存取有两种方式,利用 [ ] 或 at

1.8 string插入和删除

功能描述:

  • 对string字符串进行插入和删除字符操作;

函数原型:

  • string& insert(int pos, const char* s); //插入字符串
  • string& insert(int pos, const string& str); //插入字符串
  • string& insert(int pos, int n, char c); //在指定位置插入n个字符c
  • string& erase(int pos, int n = npos); //删除从Pos开始的n个字符

示例:

void test07()
{
	string str = "hello";
	str.insert(1, "XXX");
	cout << str << endl;

	str.erase(1, 3);  //从1号位置开始3个字符
	cout << str << endl;
}

在这里插入图片描述
**总结:**插入和删除的起始下标都是从0开始

1.9 string子串

功能描述:

  • 从字符串中获取想要的子串

函数原型:

  • string substr(int pos = 0, int n = npos) const; //返回由pos开始的n个字符组成的字符串

示例:

void test08()
{
	string email = "12346789@qq.com";
	int pos = email.find("@");//返回@所在位置
	string QQ = email.substr(0, pos);
	cout << "username: " << QQ << endl;
}

在这里插入图片描述

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

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

相关文章

Peter算法小课堂—动态规划

Peter来啦&#xff0c;好久没有更新了呢 今天&#xff0c;我们来讨论讨论提高组的动态规划。 动态规划 动态规划有好多经典的题&#xff0c;有什么背包问题、正整数拆分、杨辉三角……但是&#xff0c;如果考到陌生的题&#xff0c;怎么办呢&#xff1f;比如说2000年提高组的…

计算机网络:思科实验【2-MAC地址、IP地址、ARP协议及总线型以太网的特性】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;Cisco Packet Tracer实验 本文对应的实验报告源文件请关注微信公众号程序员刘同学&#xff0c;回复思科获取下载链接。 实验目的实验环境实验内容MAC地址、IP地址、ARP协议总线型以太网的…

渗透工具——kali中wpscan简介

一、什么是wpscan 1、常用于做用户名枚举爆破 2、WPScan是一个扫描 WordPress 漏洞的黑盒子扫描器&#xff0c;它可以为所有 Web 开发人员扫描 WordPress 漏洞并在他们开发前找到并解决问题。我们还使用了 Nikto &#xff0c;它是一款非常棒的Web 服务器评估工具&#xff0c;…

MySQL数据库调优之关联查询、排序查询、分页查询、子查询、Group by优化

关联查询优化 1.准备工作 CREATE TABLE IF NOT EXISTS type(id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,card INT(10) UNSIGNED NOT NULL,PRIMARY KEY(id));CREATE TABLE IF NOT EXISTS book( bookid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, card INT(10) UNSIGNED N…

智慧应急与物联网相结合:物联网技术如何提升智慧应急响应能力

目录 一、引言 二、智慧应急与物联网技术的结合 三、物联网技术提升智慧应急响应能力的途径 四、物联网技术在智慧应急中的应用案例 五、物联网技术在智慧应急中面临的挑战与解决方案 挑战一&#xff1a;技术标准与规范不统一 解决方案&#xff1a; 挑战二&#xff1a;…

【考研数学】基础阶段习题1800和660怎么选❓

我建议以1800题为主 1800题包含基础和强化两部分&#xff0c;基础部分题量很大&#xff0c;类型也很全面&#xff0c;并且难度一点也不高&#xff0c;适合基础不好的学生来做。 660题难度比较大&#xff0c;不适合基础阶段做。 660题虽然名字叫基础训练&#xff0c;但是不适…

英语连读技巧15

1. first one – 第一个 连读听起来就像是&#xff1a;【佛斯湾】 连读的音标为&#xff1a; 例句&#xff1a;I don’t want to be the first one there agin. 发音指导&#xff1a;在“first one”的连读中&#xff0c;"t"和"o"之间的连接几乎消失&a…

Java线程池实现原理详解

线程池是什么 线程池&#xff08;Thread Pool&#xff09;是一种基于池化思想管理线程的工具&#xff0c;经常出现在多线程服务器中&#xff0c;如MySQL。 线程过多会带来额外的开销&#xff0c;其中包括创建销毁线程的开销、调度线程的开销等等&#xff0c;同时也降低了计算…

03|Order by与Group by优化

索引顺序依次是 &#xff1a; name,age,position 案例1 EXPLAIN SELECT * FROM employees WHERE name LiLei AND position dev ORDER BY age;分析: 联合索引中只是用到了name字段做等值查询[通过key_len 74可以看出因为name字段的len74]&#xff0c;在这个基础上使用了age进…

sql-labs32关宽字节注入

一、环境 网上有自己找很快 二、如何通关 2.1解释 虚假预编译没有参数绑定的过程&#xff0c;真实预编译有参数绑定的过程 宽字节注入出现的本质就是因为数据库的编码与代码的编码不同&#xff0c;导致用户可以通过输入精心构造的数据通过编码转换吞掉转义字符。 在32关中…

华为HCIP Datacom H12-831 卷24

多选题 1、如图所示&#xff0c;某园区部署OSPF实现网络互通&#xff0c;其中Area1部署为NSSA区域。某工程师为了实现R1访问R4的环回口地址&#xff0c;在R4的OSPF进程中引入直连路由。以下关于该场景的描述,错误的有哪些项? A、在R4引入直连路由后&#xff0c;R1通过转换后的…

Java基于物联网技术的智慧工地云管理平台源码 依托丰富的设备接口标准库,快速接入工地现场各类型设备

目录 风险感知全面化 项目进度清晰化 环境监测实时化 人员管理高效化 工地数字化 数据网络化 管理智慧化 智慧工地平台整体架构 1个可扩展监管平台 2个应用端 3方数据融合 N个智能设备 智慧工地的远程监管&#xff0c;是工地负责人掌握施工现场情况的必要手段&…

第6.4章:StarRocks查询加速——Colocation Join

目录 一、StarRocks数据划分 1.1 分区 1.2 分桶 二、Colocation Join实现原理 2.1 Colocate Join概述 2.2 Colocate Join实现原理 三、应用案例 注&#xff1a;本篇文章阐述的是StarRocks-3.2版本的Colocation Join 官网文章地址&#xff1a; Colocate Join | StarRoc…

JAVA算法和数据结构

一、Arrays类 1.1 Arrays基本使用 我们先认识一下Arrays是干什么用的&#xff0c;Arrays是操作数组的工具类&#xff0c;它可以很方便的对数组中的元素进行遍历、拷贝、排序等操作。 下面我们用代码来演示一下&#xff1a;遍历、拷贝、排序等操作。需要用到的方法如下 public…

SpringMVC 学习(五)之域对象

目录 1 域对象介绍 2 向 request 域对象共享数据 2.1 通过 ServletAPI (HttpServletRequest) 向 request 域对象共享数据 2.2 通过 ModelAndView 向 request 域对象共享数据 2.3 通过 Model 向 request 域对象共享数据 2.4 通过 map 向 request 域对象共享数据 2.5 通过…

音视频数字化(数字与模拟-电影)

针对电视屏幕,电影被称为“大荧幕”,也是娱乐行业的顶尖产业。作为一项综合艺术,从被发明至今,近200年的发展史中,无人可以替代,并始终走在时代的前列。 电影回放的原理就是“视觉残留”,也就是快速移过眼前的画面,会在人的大脑中残留短暂的时间,随着画面不断地移过,…

智慧城市,未来已来:数字中国建设中的创新实践

随着数字技术的飞速发展&#xff0c;中国正迎来一个全新的智慧城市时代。在这个时代&#xff0c;城市的每一个角落都充满了科技的气息&#xff0c;人们的生活也因此变得更加便捷、高效和美好。今天&#xff0c;就让我们一起走进这个充满未来感的智慧城市&#xff0c;探索数字中…

onlyoffice api开发

编写代码 按照https://api.onlyoffice.com/editors/basic编写代码 <html> <head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scal…

长短连接对压测的影响有多大

【引言】 当我们进行压力测试时&#xff0c;长短连接是一个非常重要的参数。但是&#xff0c;你知道吗&#xff1f;长短连接对于压测结果有着非常大的影响&#xff01;如果你不理解这个参数&#xff0c;那么你的压测结果可能会出现严重的偏差。 在这篇文章中&#xff0c;我将…

使用 yarn 的时候,遇到 Error [ERR_REQUIRE_ESM]: require() of ES Module 怎么解决?

晚上回到家&#xff0c;我打开自己的项目&#xff0c;执行&#xff1a; cd HexoPress git pull --rebase yarn install yarn dev拉取在公司 push 的代码&#xff0c;然后更新依赖&#xff0c;最后开始今晚的开发时候&#xff0c;意外发生了&#xff0c;竟然报错了&#xff0c;…