C++:STL:常用容器(上):string

news2024/11/19 5:36:20

1:string容器

1.1 string基本概念

本质: string是C++风格的字符串,而string本质是一个类

string和char* 区别

1:char* 是一个指针

2:string是一个类,类内部封装了 char*  管理这个字符串,是一个 char* 型的容器

特点:

1:string类内部封装了很多成员方法,比如:差找find ,拷贝copy ,删除 delete,替换 replace,插入 insert

2:  string管理char* 所分配的内存,不用担心复制越界和取值越界,由类内部进行负责

1.2 string构造函数 

string() ------》创建一个空的字符串, string str

string(const char* c) ---->使用字符串 s 进行初始化

string(const string& str) -----》使用一个string对象初始化另一个string对象

string(int n, char c) ----->使用 n个字符 c 初始化

 案例:用四种构造函数来实例化 string 对象

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

void test() {
	string s1; // 创建空字符串,调用无参构造函数
	
	const char* s = "hello world";
	string s2(s);

	string s3(s2);

	string s4(10, 'a');

	cout << "s1 = " << endl;
	cout << "s2 = " << s2<< endl;
	cout << "s3 = " << s3 << endl;
	cout << "s4 = " << s4<< endl;
}
int main() {
	test();
}

1.3 :string赋值操作 

功能描述:给 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) // 把字符指针前n 个字符,赋值给当前字符串

string& assign(const string& s) // 当字符串s 赋值给当前字符串

string& assign(int n, char c) // 用 n个字符 c 赋值给当前字符串

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

void test() {
	string s1; // 创建空字符串,调用无参构造函数
	
	const char* s = "hello world";
	string s2(s);

	string s3(s2);

	string s4(10, 'a');

	cout << "s1 = " << endl;
	cout << "s2 = " << s2<< endl;
	cout << "s3 = " << s3 << endl;
	cout << "s4 = " << s4<< endl;
}

void test2() {
	string s1;
	s1 = "hello world";
	cout << "s1 = " << s1 << endl;

	string s2;
	s2 = s1;
	cout << "s2 = " << s2 << endl;

	string s3;
	s3 = 'a';
	cout << "s3 = " << s3 << endl;

	string s4;
	s4.assign("hello world");
	cout << "s4 = " << s4 << endl;

	string s5;
	s5.assign("hello,world", 5);
	cout << "s5 = " << s5 << endl;

	string s6;
	s6.assign(s5);
	cout << "s6 = " << s6 << endl;

	string s7;
	s7.assign(10, 'a');
	cout << "s7 = " << s7 << endl;
}
int main() {
	test();
}

 

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个字符连接到字符串结尾。

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

void test() {
	string s1; // 创建空字符串,调用无参构造函数
	
	const char* s = "hello world";
	string s2(s);

	string s3(s2);

	string s4(10, 'a');

	cout << "s1 = " << endl;
	cout << "s2 = " << s2<< endl;
	cout << "s3 = " << s3 << endl;
	cout << "s4 = " << s4<< endl;
}

void test2() {
	string s1;
	s1 = "hello world";
	cout << "s1 = " << s1 << endl;

	string s2;
	s2 = s1;
	cout << "s2 = " << s2 << endl;

	string s3;
	s3 = 'a';
	cout << "s3 = " << s3 << endl;

	string s4;
	s4.assign("hello world");
	cout << "s4 = " << s4 << endl;

	string s5;
	s5.assign("hello,world", 5);
	cout << "s5 = " << s5 << endl;

	string s6;
	s6.assign(s5);
	cout << "s6 = " << s6 << endl;

	string s7;
	s7.assign(10, 'a');
	cout << "s7 = " << s7 << endl;
}

void test3() {
	string str1 = "我";
	str1 += "爱玩游戏";
	cout << "str1 = " << str1 << endl;
	str1 += ':';
	cout << "str1 = " << str1 << endl;

	string str2 = "王者荣耀";
	str1 += str2;
	cout << "str1 = " << str1 << endl;

	string str3 = "I";
	str3.append("Love");
	cout << "str3 = " << str3 << endl;

	str3.append("game  aaaaa",4);
	cout << "str3 = " << str3 << endl;

	str3.append(" ").append(str2);
}

int main() {
	test2();
}

 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

注意  

find 查找是从左往右, rfind 是从右往左

find 找到字符串后返回查找的第一个字符位置,找不到返回 -1 

replace 在替换时,要指定从哪个位置起,多少个字符,替换成什么样的字符串

案例:测试字符串的查找和替换功能 

void test4() {
	cout << "字符串查找" << endl;
	string str1 = "abcdefgde";
	int pos;
	pos = str1.find("de");
	cout << "de 的位置在:" << pos << endl;

	pos = str1.find("UI");
	cout << "UI 的位置在:" << pos << endl;

	pos = str1.rfind("de");
	cout << "de 的位置在:" << pos << endl;

	cout << "字符串替换" << endl;
	str1.replace(1, 3, "1111");
	cout << "str1 = " << str1 << endl;
	
}

1.6:字符串比较 

功能描述:字符串之间的比较,主要是用于比较两个字符串是否相对,判断谁大谁小的意思 并不是很大。

比较方式:按照字符的  ASCII码逐个进行比较

= :两个祖父串完全相等,返回 0

> :  第一个字符串的首个 字符大于第二个字符串的首个字符,返回 1

< :  第一个字符串的首个字符小于第二个字符串的首个字符,返回-1

函数原型

int  compare(const string& s)const    // 与字符串s进行比较

int compare(const char*  chr) const    // 与字符串 chr 进行比较

案例:测试字符串的比较功能

void test5() {
	string str1 = "hello";
	string str2 = "xello";
	if (str1.compare(str2)==0) 
	{
		cout << "两个字符串相等" << endl;
	}
	else if (str1.compare(str2)<0)
	{
		cout << "第一个字符串大于第二个字符串" << endl;
	}
	else
	{
		cout << "第一个字符串小于第二个字符串" << endl;
	}
}

1.7 :string字符存取 

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

char& operator[](int n)    // 通过[] 方式取字符

char& at(int n)   // 通过at 方式获取字符

void test6() {
	string str = "hello";
	cout << "取字符串中的字符" << 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;

	cout << "修改字符串中的字符" << endl;
	str[0] = 'x';
	str.at(1) = 'x';
	cout << "str = " << str << endl;
}

 

1.8 : string插入和删除 

功能描述:对 string 字符串进行插入和删除字符操作

函数原型:

string&  insert(int pos , const char* chr)   //  插入字符

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 test7() {
	cout << "字符串插入功能" << endl;
	string str = "hello";
	str.insert(1, "111");
	cout << "str = " << str << endl;

	string str2 = "222";
	str.insert(1, str2);
	cout << "str = " << str << endl;

	// 删除功能
	str.erase(2, 4);
	cout << "str = " << str << endl;

}

 

1.9 :字符串子串 

功能描述: 从字符串中获取想要的字串

函数原型: string substr(int pos = 0,int n = npos)const  // 返回由pos开始的 n 个字符组成的字符串

案例:测试字符串字串的功能

void test8() {
	cout << "字符串子串功能" << endl;
	string str = "abcdefg";
	string substr = str.substr(1, 3);
	cout << "子串为:" << substr << endl;

	string email = "yuhongwen@163.com";
	int pos = email.find('@');
	substr = email.substr(0, pos);
	cout << "用户名:" << substr << endl;
}

 

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

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

相关文章

5G无线技术基础自学系列 | 5G网络接入问题分析

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 5G网络的接入失败或者接入时延过大都会…

实现安卓LED设备驱动:不写一行代码

文章目录一、前言二、准备工作2.1 内核版本2.2 内核文档&#xff1a;bindings->leds2.3 文档解析&#xff1a; leds-gpio.txt三、编写DTS3.1 查原理图&#xff0c;挑选GPIO3.2 编写DTS文件四、编译测试4.1 编译dt.img4.2 烧录dt.img五、基于fs的测试5.1 测试命令5.2 **点灯效…

将单向链表按照目标值value 划分成左边小,中间等,右边大的形式,给定一个单链表,判断单链表的值是否是回文结构【图文解释包你看懂】

将单向链表按照目标值value 划分成左边小&#xff0c;中间等&#xff0c;右边大的形式 例如 1 -> 3 -> 5-> 3 -> 7 按照value 3划分 1-> 3-> 3 -> 5 -> 7 解题思路&#xff1a;给定值为 value 用6个变量&#xff0c;分别表示 小于value 的Head sH &…

2023年天津中德应用技术大学专升本专业课考试具体安排及准考证

2023年天津中德应用技术大学高职升本科专业课考试准考证下载及考生须知 一、准考证下载打印 12月24日12点开始&#xff0c;专业课报名审核通过的考生&#xff0c;登录学校专业课报名系统&#xff08;114.115.135.236/jobgroup/f&#xff09;&#xff0c;点击“准考证”&#xf…

Qt之悬浮球菜单

一、概述 最近想做一个炫酷的悬浮式菜单&#xff0c;考虑到菜单展开和美观&#xff0c;所以考虑学习下Qt的动画系统和状态机内容&#xff0c;打开QtCreator的示例教程浏览了下&#xff0c;大致发现教程中2D Painting程序和Animated Tiles程序有所帮助&#xff0c;如下图所示&a…

Java反射面试题

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java面试题…

科技交流英语(2022秋)Unit 6 test

科技交流英语&#xff08;2022秋&#xff09;Unit 6 test 简介 由电子科技大学组织开设&#xff0c;授课教师为李京南、庞慧、刘兆林等5位老师。 课程介绍 英语广泛用于工程技术领域的国际交流。如何使用简洁的语言清楚地传递信息是工程师在国际舞台上常常面临的问题。本课…

【Vue】Vue重写教室管理系统的前端网页V1(前后端分离)--20221222

项目说明 目的 练习并熟悉Vue2 的API&#xff0c;来为Vue项目做准备&#xff1a; 插值语法插槽props和data父子组件通信Ajax异步请求数据生命周期函数methods方法computed属性vue-router、路由守卫、query/params传参、编程函数式路由模拟后端服务器传送数据打包项目 需要加…

Tableau可视化设计案例-06Tableau填充地图,多维地图,混合地图

文章目录Tableau可视化设计案例06 填充地图&#xff0c;多维地图&#xff0c;混合地图1.填充地图1.1 各省售电量填充地图 地图格式设置2.多维地图2.1 各省售电量多维地图3.混合地图3.1 各省售电量混合地图Tableau可视化设计案例 本文是Tableau的案例&#xff0c;为B站视频的笔…

如何花最少的资源遍历二叉树

文章目录一、递归遍历二叉树1.1 前序遍历1.2 中序遍历1.3 后序遍历二、非递归遍历二叉树2.1 前序遍历2.2 中序遍历2.3 后序遍历三、高效的 Morris 遍历3.1 前序遍历3.2 中序遍历3.3 后序遍历关于二叉树的遍历也是面试过程中非常有可能考的话题。常见的简单的递归遍历二叉树&…

头条号权重高有什么优势?头条权重在线查询

头条号权重是根据你的关键词排名、预估流量等综合评估计算出的一个"权重值"&#xff0c;关键词指数越大&#xff0c;排名越好&#xff0c;预估的流量就越多&#xff0c;权重也就越高。 如果是查询头条号权重较少&#xff0c;可以看看这3个方法&#xff1a; 1、指…

flutter 环境搭建

一、简介 Flutter 是谷歌开发的一款开源、免费的&#xff0c;基于 Dart 语言的U1框架,可以快速在i0S和Android上构建高质量的原生应用。 它最大的特点就是跨平台和高性能。Dart是由谷歌&#xff0c;在2011 年开发的计算机编程语言&#xff0c;它可以被用于Web、服务器、移动应…

腾讯云轻量应用服务器安装和配置宝塔 Linux 面板腾讯云专享版

宝塔 Linux 面板腾讯云专享版由腾讯云与堡塔公司联合开发&#xff0c;专享版在已支持普通版所有功能的基础上&#xff0c;还默认集成腾讯云对象存储、文件存储、内容分发网络和 DNS 解析插件。插件具备如下功能&#xff1a; 支持将对象存储的存储桶挂载到轻量应用服务器实例&a…

IDEA技巧:如何根据注释生成swagger注解

相信大家在进行java项目开发&#xff0c;肯定会接触到swagger的&#xff0c;一款动态生成api文档的神奇&#xff0c;只需要在api上面加上注解&#xff0c;就可以生成文档&#xff0c;现在我简单介绍下swagger的快速入门&#xff0c;最后再说下如何根据注释快速生成这些烦人的注…

(模板)矩阵乘法:斐波那契数列问题

在数学上&#xff0c;斐波那契数列以如下被以递推的方法定义&#xff1a; F(1)1&#xff0c;F(2)1, F(n)F(n-1)F(n-2&#xff09;&#xff08;n>3&#xff0c;n∈N*&#xff09;。 由以上推理公式&#xff0c;可以求得任何一项的斐波那契数列值。 弊端&#xff1a;斐波那…

UI自动化测试-pytest框架

在进行UI自动化测试的时候&#xff0c;我们需要工具来对测试用例进行收集&#xff0c;执行&#xff0c;标记&#xff0c;参数化。pytest就是这样一个工具。 pytest实际是python的一个单元测试框架&#xff0c;其他还有如unittest等&#xff0c;它可以实现按照规则搜索测试用例…

国产化服务环境中使用gunicorn部署Flask应用并配置开机自启

背景 服务端由第三方部署了一个基于 darknet &#xff08;一个较为轻型的完全基于C与CUDA的开源深度学习框架&#xff09;的识别算法服务&#xff0c;通过 Flask 的 Web 服务对业务服务暴露 API 接口。作为测试&#xff0c;一开始是直接通过 python3 app.py 的命令行启动的服务…

Ubuntu安装Anaconda详细步骤

本文主要讲述了在Ubuntu中安装anaconda的具体步骤。 准备环境&#xff1a;Ubuntu&#xff0c;Anaconda3 一、安装Anaconda3 在清华镜像下载Linux版本的anaconda&#xff1a; https://mirrors.bfsu.edu.cn/anaconda/archive/我选择的是Anaconda3-2022.10-Linux-x86_64.sh 下…

数组(7)

目录 1、一维数组 1、数组的创建 2、数组的初始化 3、一维数组的使用 4、一维数组在内存中的存储 2、二维数组 1、二维数组的创建 2、二维数组的初始化 3、二维数组的使用 4、二维数组在内存中的存储 3、数组越界 4、数组作为函数参数 1、冒泡排序&#xff1a; 5…

【学习笔记12.24】关于事务你必须知道的几件事

文章目录事务基础知识什么是事务&#xff1f;开启事务事务隔离级别事务基础知识 在MySQL中&#xff0c;只有InnoDB存储引擎是支持事务的。 什么是事务&#xff1f; 事务是逻辑操作的最小单元&#xff0c;使数据从一个状态转变为另一个状态。 也可以通过事务四大特性ACID来更…