string常见接口的使用(基于c++标准库中的STL)

news2024/12/26 10:55:44

前言

        string是c++中常见的容器,它是用来管理字符的,它在物理上是可以动态增长的线性表,对于了解它的使用,以及常见的接口使用对于我们日常开发和使用是很有必要的,所以接下来让我们一起来了解一下string常见的接口吧!

目录

1.string类常见的构造函数

2.迭代器

        2.1迭代器 

        2.2遍历方式 

3.容量相关的接口

4.数据的增删查改

5.string类的大小比较

        5.1string对象的大小比较 

        5.2operator+,operator<<和operator>> 


 

1.string类常见的构造函数

        

string常见的构造函数
函数名称功能说明
string();
构造一个空的string对象
(const string& str);
使用字符串构造一个string对象
string (size_t n, char c);
构造n个字符c的string类
string (const char* s, size_t n);
从字符串上取长度为n构造string对象
string (const string& str);
拷贝构造函数

         例如:

void TestString1()
{
	string s1;//无参的构造
	string s2("hello");//字符串构造
	string s3("abcdefg", 3);//用字符串的前三个字符进行构造
	string s4(5, 'a');//用5个字符a构造string对象
	string s5(s2);//拷贝构造
}

2.迭代器

        2.1迭代器 

迭代器
迭代器解释
iterator  begin();

const_iterator begin() const;

begin()是返回string对象第一个字符的迭代器,

const修饰的begin()是返回const string的第一个字符的迭代器

iterator end();
const_iterator end()const;

end()是返回string对象最后一个字符位置的下一个位置的迭代器

const修饰的end()是返回const string的最后一个字符所在位置的下一个位置的迭代器

reverse_iterator rbegin();
const_reverse_iterator rbegin() const;

rbegin()和rend()是为了支持string对象倒着遍历。

rbegin()返回的string对象最后一个字符的迭代器。

const修饰的rbegin()返回的const string对象最后一个字符的迭代器。

reverse_iterator rend();
const_reverse_iterator rend() const;

rend()返回的是string对象第一个字符位置的前一个位置的迭代器

const修饰的rend()返回的是const string对象第一个字符位置的前一个位置的迭代器

 

        例如:

void TestString2()
{
	string s2("hello");//字符串构造
	string s3("abcdefg", 5);//用字符串的前三个字符进行构造
	string::iterator it = s3.begin();
	while (it != s3.end())//迭代器正向遍历
	{
		cout << *it;
		it++;
	}
	cout << endl;
	string::reverse_iterator rit = s3.rbegin();
	while (rit != s3.rend())//迭代器反向遍历
	{
		cout << *rit;
		++rit;
	}
	cout << endl;
}

 

void PrintString(const string&s)
{
	string::const_iterator it = s.begin();
	while (it != s.end())//const string对象的正向遍历
	{
		cout << *it;
		++it;
	}
	cout << endl;
}
void ReversePrintString(const string& s)
{
	string::const_reverse_iterator it = s.rbegin();
	while (it != s.rend())//const string对象的逆向遍历
	{
		cout << *it;
		++it;
	}
	cout << endl;
}

        2.2遍历方式 

        string对象可以有多种遍历方式,如下:

        1.operator[]

        2.迭代器

        3.范围for 

void TestString3()
{
	string s1("happy happy every day!");
	string::iterator it = s1.begin();
	while (it != s1.end())//const string对象的遍历
	{
		cout << *it;
		++it;
	}
	cout << endl;
	for (int i = 0; i < s1.size(); ++i)//operator遍历
	{
		cout << s1[i];
	}
	cout << endl;
	for (auto e : s1)//范围for遍历
	{
		cout << e;
	}
	cout << endl;
}

        string类重载类operator[]使得我们遍历string对象时可以像遍历数组一样遍历。

        函数原型:

char& operator[] (size_t pos);const char& operator[] (size_t pos) const;

        范围for是c++11新增的语法,范围for是由迭代器支持的,编译的时候范围for会被编译器替换为迭代器。

3.容量相关的接口

容量相关的函数
函数名称函数作用
size返回字符串中有效字符的个数
capacity返回字符串存储字符的最大个数
length返回字符串中有效字符的个数
clear清空字符串中的有效字符
empty判断字符串是不是空串
resize改变字符串中有效字符的个数
reserve改变字符串的存储字符的最大个数

         例如:

void TestString4()
{
	string s1("happy happy");
	for (int i = 0; i < s1.size(); ++i)//operator遍历
	{
		cout << s1[i];
	}
	cout << endl;
	cout << s1.length()<<endl;//输出字符串有效字符的个数
	cout << s1.empty() << endl;//判断字符串是不是空
	cout << s1.capacity() << endl;//输出字符串的存储最大字符的个数

	s1.resize(8, 'd');//改变s1的有效字符个数,
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;

	s1.reserve(20);//改变s1的容量
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
}

        注意resize函数,是用来改变string对象的有效字符个数的,它的原型: 

void resize (size_t n);void resize (size_t n, char c);

        如果传给resize的参数的n大于原来字符串的size,就会在原来字符串的后面加上n-size个字符c,如果n大于原来字符串的capacity,原来字符串的容量也会被改变。例如:

void TestString4()
{
	string s1("happy happy");
	for (int i = 0; i < s1.size(); ++i)//operator遍历
	{
		cout << s1[i];
	}
	cout << endl;

	
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;

	s1.resize(20, 'd');//改变s1的有效字符个数,
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;

	
}

 

          reserve是用来改变字符串的最大容量的,它的函数原型为:void reserve (size_t n = 0);

如果n小于字符串原来的最大容量,则字符串的容量不会改变,如下:

void TestString4()
{
	cout << "reserve前:"<<endl;
	string s1("happy happy");
	for (int i = 0; i < s1.size(); ++i)//operator遍历
	{
		cout << s1[i];
	}
	cout << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;

	cout << "reserve后:" << endl;
	s1.reserve(5);//改变s1的容量
	cout << s1 << endl;
	cout << s1.size() << endl;
	cout << s1.capacity() << endl;
}

 

4.数据的增删查改

string接口说明
函数名称功能说明

push_back

pop_back

在字符串的尾上插入一个字符

删除字符串尾上的字符

append在字符串尾上插入一个字符串
opreator+=在字符串的末尾插入一个字符或者一个字符串
insert在任意合法位置插入一个字符或者字符串
erase删除任意合法位置的字符
find和npos

从pos 位置开始向后在字符串str中查找另一个字符或者字符串,如果没有找到返回npos,如果找到了返回该字符或者字符串在字符串str中的位置

substr在str中从pos位置开始,截取n个字符,然后将其返回
c_str返回c格式的字符串
rfind从pos位置开始向前在字符串str中查找另一个字符或者字符串,如果没有找到返回npos,如果找到了返回该字符或者字符串在字符串str中的位置

         例如:

void TestString5()
{
	string s1;
	s1.push_back('h');//在字符串末尾插入元素
	s1.push_back('e');
	s1.push_back('l');
	s1.push_back('l');
	s1.push_back('0');
	cout << s1 << endl;
	s1.pop_back();//删除s1末尾的元素
	s1.pop_back();//删除s1末尾的元素
	s1.pop_back();//删除s1末尾的元素
	cout << s1 << endl;

	s1.append("xxxxxx");//在s1末尾插入一个字符串
	cout << s1<<endl;
	string s2;
	s2 += 'a';//在s2末尾插入一个字符
	s2 += 'a';
	s2 += 'a';
	s2 += 'a';
	s2 += 'a';
	cout << s2 << endl;
	s2 += "xxxxxxxx";//在s2的末尾插入一个字符串
	cout << s2 << endl;

	string s3("bbbbbbbbbb");
	s3.insert(s3.begin(), 'c');//在s3的开始位置插入一个字符
	s3.insert(s3.begin(), 'c');
	s3.insert(s3.begin(), 'c');
	cout << s3 << endl;

	s3.insert(s3.begin(), 'c');
	s3.insert(5,2, 'c');//在s3第五个字符之前插入2个字符
	cout << s3 << endl;
	s3.insert(3, "ffff");//在s3第三个字符之前插入一个字符串
	cout << s3 << endl;
	cout << s3.c_str() << endl;//返回c类型的字符串
}

        find是在字符串str中查找字符或者字符串,函数的原型:         它可以查找字符,字符串还可以查找string对象。它返回的是 字符,字符串在对象string(字符串str)中的位置。我们可以配合substr使用,substr的函数原型:

string substr (size_t pos = 0, size_t len = npos) const;它是从pos位置开始取出长度为len的字符串的子串,如果len的长度大于从pos位置开始字符串的长度,就会从pos位置开始取到字符串的结束。npos是string类中的静态成员变量,它的值为无符号整形的最大值。如图:

rfind和find的用法相似只不过rfind是从string对象的末尾开始从后向前查找。

        使用:

void TestString6()
{
	string s1("abcdefg hijklmn opqrst uvwxyz");
	size_t pos = s1.find('c');//查找字符c
	if (pos != string::npos)//确保找到要查找的字符
	{
		cout<<s1.substr(pos, 1);//从s1中取出子串
	}
	pos = s1.find("def");
	if (pos != string::npos)//确保找到要查找的字符
	{
		cout << s1.substr(pos, 1);//从s1中取出子串
	}
	pos = s1.rfind("def");//从后向前查找
	if (pos != string::npos)//确保找到要查找的字符
	{
		cout << s1.substr(pos, 1);//从s1中取出子串
	}
}
void SplitStr(const string& url)//分离协议,域名和资源
{
	size_t pos = url.find(':');
	if (pos != string::npos)
	{
		cout << url.substr(0, pos) << endl;
	}
	size_t pos1 = url.find('/', pos + 3);
	if (pos != string::npos)
	{
		cout << url.substr(pos + 3, pos1 - (pos + 3)) << endl;
	}
	cout << url.substr(pos1 + 1) << endl;
}

5.string类的大小比较

        5.1string对象的大小比较 

        string是可以用来进行大小比较的,本质上还是比较字符串中字符的ASCII码值。例如:

void TestString8()
{
	string s1("abcd");
	string s2("aabc");
	cout <<( s1 > s2) << endl;//判断s1和s2的大小关系
	cout << (s1 < s2) << endl;
}

        5.2operator+,operator<<和operator>> 

        string类重载输入和输出,所以string对象可以像内置类型一样输入输出。如下:

void TestString9()
{
	string s1("abcdefghijkl");
	cout << s1 << endl;//输出s1
	string s2;
	cin >> s2;//从标准输入中接收字符
}

        operator+的效率较低,一般不常用,operator+ 和operator+=的区别是+不会改变对象本身,+=会改变对象本身。例如:

void TestString10()
{
	string s1("abcdefghijkl");
	cout << s1 << endl;//输出s1
	s1 + "1111";
	cout << s1 << endl;
	s1 += "1111";
	cout << s1 << endl;
}

 

 

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

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

相关文章

Linux Samba远程代码执行漏洞(CVE-2017-7494)漏洞复现

概述 1.该漏洞CVE-2017-7494又被称为Linux版的永恒之蓝 2.主要是利用smb上的反弹shell漏洞&#xff0c;进行远程代码执行 3.samba 3.5.0 到4.6.4/4.5.10/4.4.14的中间版本、docker 漏洞原理 1.远程命令执行 Samba允许连接一个远程的命名管道&#xff0c;并且在连接前会调用…

chatgpt赋能python:Python中两数取大——实现与应用

Python中两数取大——实现与应用 在Python编程中&#xff0c;经常需要对数值进行比较运算。而其中一种比较运算就是取两个数的最大值。Python提供了简单而有效的方法来实现这个功能。在本文中&#xff0c;我们将介绍Python中两个数取大的方法&#xff0c;并探讨其在实际应用中…

(转载)基于遗传算法的LQR控制器优化设计(matlab实现)

以下内容大部分来源于《MATLAB智能算法30个案例分析》&#xff0c;仅为学习交流所用。 5.1 理论基础 5.1.1 LQR控制 假设线性时不变系统的状态方程模型为 可以引入最优控制的性能指标&#xff0c;即设计一个输入量u,使得 为最小。其中&#xff0c;Q和R分别为状态变量和输…

研究人员发现新的 ICS 恶意软件工具包旨在导致电力中断

在过去几年中&#xff0c;国家支持的攻击者一直在提高攻击电网等关键基础设施以造成严重破坏的能力。 这个武器库的新成员是一个恶意软件工具包&#xff0c;它似乎是由一家俄罗斯网络安全公司为红队演习开发的。 该恶意软件被 Mandiant 的研究人员称为 COSMICENERGY&#xff…

资源配额(ResourceQuota) 资源限制(LimitRange)

资源配额 ResourceQuota 资源配额 ResourceQuota&#xff1a;限制命名空间总容量。 当多个团队、多个用户共享使用K8s集群时&#xff0c;会出现不均匀资源使用&#xff0c;默认情况下先到先得&#xff0c;这时可以通过ResourceQuota来对命名空间资源使用总量做限制&#xff0c;…

当 BLIP-2 遇上 Diffusion!可控图像生成的最优解,图像主题、风格任意切换,指哪改哪

夕小瑶科技说 原创 作者 | 智商掉了一地、ZenMoore 关于 P 图&#xff0c;本懒人想说的简直太多了&#xff0c;之前想换个背景总会把主体抠成毛边&#xff0c;随着最近越来越多的强大图像或多模态工具的诞生&#xff0c;人们在图像创作方面的技术实力越来越强大。比如&#x…

chatgpt赋能python:Python中cwd的介绍与使用

Python中cwd的介绍与使用 在Python编程中&#xff0c;经常需要获取当前工作目录&#xff08;current working directory&#xff0c;缩写为cwd&#xff09;&#xff0c;以便进行文件操作、路径拼接等操作。本文将介绍如何使用Python中的os模块和pathlib模块获取和修改cwd&…

整型在内存中的存储,整型最大值最小值的推导,以及大小端的介绍

整数在内存中的存储 我们知道C语言有以下基本的整型类型&#xff1a; char //字符型 short //短整型 int //整型 long //长整型 long long //更长的整型我们可以用操作符sizeof和在<limits.h>头文件下&#xff0c;可以查看到各基本数据类型的所占字节的大小以及整形所…

【笔记整理】常见聚类算法

【笔记整理】常见聚类算法 文章目录 【笔记整理】常见聚类算法一、均值偏移 - Mean-shift&#xff08;★★★★&#xff09;1、概述 & 图解&#xff08;“偏心”&#xff09;2、公式 & 步骤1&#xff09;基本公式&#xff08;“偏移量更新圆心”&#xff09;2&#xff…

chatgpt赋能python:Python两数相加代码:基础知识和实现方法

Python两数相加代码&#xff1a;基础知识和实现方法 简介 Python是一门高级编程语言&#xff0c;以其简洁、易读的语法和强大的库而被广泛应用于数据分析、机器学习、Web开发等领域。在这篇文章中&#xff0c;我们将介绍如何使用Python编写一个简单的两数相加代码&#xff0c…

约瑟夫环的线性解法

参考:https://www.luogu.com.cn/problem/P8671 参考:https://zhuanlan.zhihu.com/p/121159246 参考:https://blog.csdn.net/doge__/article/details/82429348 #include <bits/stdc.h> using namespace std; int n,k,s; int main(){cin>>n>>k;for(int i2;i&…

chatgpt赋能python:Python中的importmath

Python中的import math Python是一种高级编程语言&#xff0c;有众多强大的功能库可供使用。其中一个非常常用的功能库就是math。math库提供了许多用于进行数学运算的函数。在本文中&#xff0c;我们将介绍Python中的import math。 什么是import math&#xff1f; 在Python中…

chatgpt赋能python:Python中Decode函数详解:什么是Decode函数,它有什么作用?

Python中Decode函数详解&#xff1a;什么是Decode函数&#xff0c;它有什么作用&#xff1f; 介绍Decode函数 在Python编程中&#xff0c;我们经常需要处理文本数据。数据的处理可能涉及到不同的编码格式&#xff0c;比如ASCII、UTF-8、GBK等等。而Decode函数就是Python中用于…

安装并新建windows下wxwroks7.0 bootrom工程

双击steup.exe 直接next 直接next 选择typical&#xff0c;然后next I accept 安装完成finish 现在双击Workbench 4&#xff0c;新建vxworks7.0工程&#xff0c;会出现下面的情况&#xff0c;因为没有licence 安装licence&#xff0c;将zwrsLicense-vx7-perm.lic粘贴到安装目…

chatgpt赋能python:Python中的Dash框架:数据可视化新选择

Python中的Dash框架&#xff1a;数据可视化新选择 随着大数据时代的到来&#xff0c;数据可视化成为日益重要的一环。Python早已成为数据科学家和工程师的首选语言之一&#xff0c;然而如何将数据转化为可视化图表呢&#xff1f;这时候&#xff0c;Dash框架应运而生。 什么是…

AHB-to-APB Bridge——08burst_test(rdy、nrdy、slverr、tight)、地址

-------------- burst_test:与single_test不同的是&#xff0c;需要在run_phase中使用fork join 让AHB侧和APB侧同时工作&#xff08;不能等AHB都发完APB才工作&#xff09;&#xff1b;num_apb_seq为APB已传输的个数&#xff0c;当APB侧传输数据的个数&#xff0c;大于或等于A…

dbn_svm电池容量soc预测,深度信念网络DBN+支持向量机SVM的电池容量SOC预测

目录 背影 DBN神经网络的原理 DBN神经网络的定义 受限玻尔兹曼机(RBM) LSTM长短期神经网络的原理 DBN+SVM的时间序列电容预测 基本结构 主要参数 MATALB代码 结果图 展望 背影 DBN是一种深度学习神经网络,拥有提取特征,非监督学习的能力,本文用DBN提取特征,用SVM分类,…

chatgpt赋能python:Python中0.0和0的相同性探究

Python中0.0和0的相同性探究 Python是一种动态且解释型的编程语言&#xff0c;被广泛应用于编写Web应用程序、数据分析、人工智能等领域。当我们在Python中进行数值比较时&#xff0c;可能会遇到这样一个问题&#xff1a;0.0和0是否相同&#xff1f;本文将会进行探究&#xff…

【Python】一个简单的小程序,实现批量修改图片格式(附完整代码及程序)

程序下载地址&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1ser7iEMRS54syvwl1cck1Q?pwdjr66 提取码&#xff1a;jr66 一、完整代码 如果想要测试代码&#xff0c;记得在使用前先保证已经安装了Python的PIL模块 import os from tkinter import Tk, Button, messa…

数据库基础——7.多表查询

这篇文章来讲一下数据库中的多表查询 目录 1. 一个案例引发的多表连接 1.1 案例说明 1.2 笛卡尔积&#xff08;或交叉连接&#xff09;的理解 1.3 案例分析与问题解决 2. 多表查询分类讲解 2.1 等值连接 vs 非等值连接 2.1.1等值连接 2.1.2 非等值连接 2.2 自连接 vs…