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

2023-11-19

前言

        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;
}

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 起订量要求?违背了目的?

    是否需要虚拟化您想要模拟的所有属性访问器就违背了模拟的目的 我的意思是 如果我必须修改我的对象并虚拟化我想要模拟的每个访问器 我难道不能继承我的类并自己模拟它吗 你的问题非常有效 但如果你仔细想想 没有其他方法可以模拟课程 如果你采用一个接
  • 如何将十六进制字符串转换为十六进制数字[重复]

    这个问题在这里已经有答案了 可能的重复 如何将十六进制字符串转换为有符号整数 https stackoverflow com questions 3705429 how do i convert hex string into signed
  • 使用API​​隐藏程序标题栏

    它可以使用 c 和 windows api 删除窗口控制台标题栏 如果是的话如何 请 这个简单的应用程序隐藏并显示其所在控制台的标题栏 它会立即将控制台标题更改为 guid 以查找窗口句柄 然后 它使用 ToggleTitleBar 使用找
  • 在Application_AquireRequestState事件中用POST数据重写Url

    我有一个在其中注册路线的代码Application AcquireRequestState应用程序的事件 注册路由后 我会在 Http 运行时缓存中设置一个标志 这样我就不会再次执行路由注册代码 在此事件中注册路线有特定原因Applicat
  • 访问“if”语句之外的变量

    我怎样才能使insuranceCost以外可用if陈述 if this comboBox5 Text Third Party Fire and Theft double insuranceCost 1 在 if 语句之外定义它 double
  • 矩阵向量变换

    我正在编写一个代码来制作软件蒙皮器 骨骼 皮肤动画 并且我正处于 优化 阶段 蒙皮器工作得很好 并且在 Core 上 1 09 毫秒内对 4900 个三角形网格与 22 个骨骼进行蒙皮Duo 2 Ghz 笔记本 我需要知道的是 1 有人可以
  • 有没有办法使用 i387 fsqrt 指令获得正确的舍入?

    有没有办法使用 i387 fsqrt 指令获得正确的舍入 除了改变精确模式在 x87 控制字中 我知道这是可能的 但这不是一个合理的解决方案 因为它存在令人讨厌的重入型问题 如果 sqrt 操作中断 精度模式将出错 我正在处理的问题如下 x
  • 方法“xxx”不能是事件的方法,因为该类派生的类已经定义了该方法

    我有一个代码 public class Layout UserControl protected void DisplayX DisplayClicked object sender DisplayEventArgs e CurrentDi
  • 默认值 C# 类 [重复]

    这个问题在这里已经有答案了 我在控制器中有一个函数 并且我收到表单的信息 我有这个代码 public Actionresult functionOne string a string b string c foo 我尝试将其转换为类似的类
  • 我可以仅在少数情况下关闭模拟吗

    我有一个始终使用模拟的应用程序 但是 当用户以管理员身份登录时 一些操作需要他们写入服务器本身 现在 如果这些用户在实际服务器上没有权限 有些用户没有 则不会让他们写入 我想做的是关闭几个命令的模拟 有没有办法做这样的事情 using Ho
  • C# datagridview 列转入数组

    我正在用 C 构建一个程序 并在其中包含一个 datagridview 组件 datagridview 有固定数量的列 2 我想将其保存到两个单独的数组中 但行数确实发生了变化 我怎么能这样做呢 假设一个名为 dataGridView1 的
  • 操纵 setter 以避免 null

    通常我们有 public string code get set 如果最终有人将代码设置为 null 我需要避免空引用异常 我尝试这个想法 有什么帮助吗 public string code get set if code null cod
  • 如何用 C 语言练习 Unix 编程?

    经过五年的专业 Java 以及较小程度上的 Python 编程并慢慢感觉到我的计算机科学教育逐渐消失 我决定要拓宽我的视野 对世界的一般用处 并做一些 对我来说 感觉更重要的事情就像我真的对机器有影响一样 我选择学习 C 和 Unix 编程
  • 系统错误 124 - SHFileOperation 的 ERROR_INVALID_LEVEL

    我在使用时遇到问题SHFileOperation SHFileOperation SHFILEOPSTRUCT https stackoverflow com questions 9191415 shfileoperation shfile
  • 允许使用什么类型的内容作为 C 预处理器宏的参数?

    老实说 我很了解 C 编程语言的语法 但对 C 预处理器的语法几乎一无所知 尽管我有时在编程实践中使用它 所以问题来了 假设我们有一个简单的宏 它扩展为空 define macro param 可以放入宏调用构造中的语法有哪些限制 调用宏时
  • 从事务范围调用 WCF 服务方法

    我有这样的代码 using TransactionScope scope TransactionScopeFactory CreateTransactionScope some methodes calls for which scope
  • .NET JIT 编译的代码缓存在哪里?

    NET 程序首先被编译为 MSIL 代码 当它被执行时 JIT编译器会将其编译为本机机器代码 我想知道 这些JIT编译的机器代码存储在哪里 它只存储在进程的地址空间中吗 但由于程序的第二次启动比第一次快得多 我认为即使在执行完成后 该本机代
  • 如何使用收益返回和递归获得字母的每个组合?

    我有几个像这样的字符串列表 可能有几十个列表 1 A B C 2 1 2 3 3 D E F 这三个仅作为示例 用户可以从几十个具有不同数量元素的类似列表中进行选择 再举个例子 这对于用户来说也是一个完全有效的选择 25 empty 4 1
  • 如何设置 CMake 与 clang 交叉编译 Windows 上的 ARM 嵌入式系统?

    我正在尝试生成 Ninja makefile 以使用 Clang 为 ARM Cortex A5 CPU 交叉编译 C 项目 我为 CMake 创建了一个工具链文件 但似乎存在错误或缺少一些我无法找到的东西 当使用下面的工具链文件调用 CM
  • 启动画面后主窗口出现在其他窗口后面

    我有一个带有启动屏幕的 Windows 窗体应用程序 当我运行该应用程序时 启动屏幕显示正常 消失并加载应用程序的主窗体 但是 当我加载主窗体时 它出现在包含该应用程序的 Windows 资源管理器目录下 这是运行启动画面然后运行主窗体的代

随机推荐

  • 如何遍历一个栈而且保持原栈不动

    用Iterator public static void printStack Stack
  • 适合于流式播放的DirectShow客户服的编写

    转载请标明是引用于 http blog csdn net chenyujing1234 例子代码 包括客户端与服务端 编译工具 VS2005 http www rayfile com zh cn files a34cb700 74ce 11
  • 免费实用的日记应用:Day One for Mac中文版

    Day One for Mac是一款运行在Mac平台上的日记软件 你可以使用Day One for mac通过快速菜单栏条目 提醒系统和鼓舞人心的信息来编写更多内容 day one mac版还支持Dropbox同步功能 想要day one
  • Linux shell中if [ $? -eq 0 ] 语句作用:判断命令是否执行成功

    shell脚本中 是指上一次命令执行的成功或者失败的状态 如果成功就是0 失败为1 语句if eq 0 是判断if语句的上一个命令执行如果成功就执行if中的语句 否则就执行else中的内容 note 使用时要注意 if后面的中括号 eq 0
  • ES概述与JS实现

    一 ES概述与JS实现 ES是国际标准化组织发布的浏览器脚本语言的标准 全名 ECMAScript ES是JS语言的国际标准 JS是ES的实现 在日常场合 两个词可以互换 ES是JS的子集 它是JS的内容的一部分 一个完整的JS实现是由以下
  • Ubuntu snap 使用大量 /dev/loop 设备

    snap 是 Ubuntu 上的新型软件包管理方式 但也证明 snap 虽然想以新代旧 但明显做的并不好 这里也是 snap 软件包管理的问题 自带的 咱并不想要 这个问题类似于 MacOS 上安装了 img 格式的软件后会有一个挂载点存在
  • 【DETR】3、Conditional DETR

    文章目录 一 Conditional DETR 是怎么被提出来的 二 Conditional DETR 的具体实现 2 1 框架结构 2 2 DETR 的 cross attention 和 Conditional DETR 的 cross
  • 开始编写Spring Boot代码及运行该代码

    编写代码 为了完成应用程序 我们需要创建一个单独的Java文件 Maven默认会编译src main java下的源码 所以你需要创建那样的文件结构 然后添加一个名为src main java Example java的文件 import
  • Java之路:变量作用域

    变量作用域 变量是有作用范围 Scope 的 也即作用域 一旦超出变量的作用域 就无法再使用这个变量 在程序中 变量一定会被定义在某一对大括号中 该大括号所包含的代码区便是这个变量的作用域 按作用域范围划分 变量分为成员变量和局部变量 1
  • Python 爬虫入门基础

    什么是爬虫 爬虫 即网络爬虫 大家可以理解为在网络上爬行的一直蜘蛛 互联网就比作一张大网 而爬虫便是在这张网上爬来爬去的蜘蛛咯 如果它遇到资源 那么它就会抓取下来 想抓取什么 这个由你来控制它咯 比如它在抓取一个网页 在这个网中他发现了一条
  • 1Panel本人目前为止,遇到过的最牛docker管理工具

    1Panel 现代化 开源的 Linux 服务器运维管理面板 1Panel 的功能和优势包括 快速建站 深度集成 Wordpress 和 Halo 域名绑定 SSL 证书配置等一键搞定 高效管理 通过 Web 端轻松管理 Linux 服务器
  • undefined control sequence .....等系列问题

    undefined control sequence includegraphics Undefined control sequence LN col undefined control sequence 等问题 在文章最前面的 docu
  • Jmeter 课程笔记(五)集合点、思考时间和三种断言

    添加集合点 Http请求 右键 定时器 Synchronizing Timer Numberb of Simulated Users to Group by 并发用户数量 默认为0则与线程组的线程数一致 Timeout inmillisec
  • jQuery ajax(自动补全)

    1 Ajax了解 Ajax 是一种用于创建快速动态网页的技术 1 1为什么用Ajax 无刷新 不刷新整个网页 只刷新局部 无刷新的好处 值更新部分页面 有效利用宽带 提高用户体验 2 Ajax用来做什么 用来刷新局部页面 不使用 Ajax
  • 镜之Json Compare Diff

    前言 镜 寓意是凡事都有两面性 Json 对比也不例外 因公司业务功能当中有一个履历的功能 它有多个版本的 JSON 数据需要对比出每个版本的不同差异节点并且将差异放置在一个新的 JSON 当中原有结构不能变动 差异节点使用数组对象的形式存
  • Unity3D 官方文档 平台特殊化之Standalone和多显示器的处理

    版本 unity 5 6 语言 C 总起 Standalone 我一眼看下去的理解就是PC机平台 官方文档中说该平台指的是Mac Windows和Linux 这篇文章主要讲的是Standalone平台下的设置 通过点击菜单栏的File gt
  • linux cat命令使用方法,Linux cat命令怎么使用

    作为一个典型的DOS 和WINDOWS用户 让我们一起来学习Linux的一些主要命令 下面跟着学习啦小编来一起了解下Linux cat命令怎么使用吧 Linux cat命令使用方法 cat命令主要用来查看文件内容 创建文件 文件合并 追加文
  • MySQL数据库被攻击,被删库勒索,逼迫我使出洪荒之力进行恢复数据

    昨天连夜赶了一篇文章 讲述了一个被黑客连续攻击服务器三次的普通 搬砖人 一次比一次艰难 一次比一次狠 我给大家看几张图 看看黑客的 佳作 首先创建一个数据库 README FHX 然后创建表 README 插入一条数据 内容如下 内容 以下
  • 学生信息后台管理系统(GUI)

    一 目的 通过制作学生信息后台管理系统熟悉java中JDBC和CUI 图形用户接口 的使用 二 实验工具 1 Eclipse IDE Version 2020 12 4 18 0 2 mysql 3 Navicat Premium 15 数
  • string常见接口的使用(基于c++标准库中的STL)

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