【C++】STL容器-string常用接口

1.string类的优势及重要性(部分)

C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。

在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。

2. 标准库中的string类

2.1 string类(了解)

附文档链接:
SLT-string类

  1. 字符串是表示字符序列的类, string是表示字符串的字符串类
  2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性,该类的接口与常规容器的接口基本相同,添加了一些专门用来操作string的常规操作。
  3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信息,请参阅basic_string)。
  4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits和allocator作basic_string的默认参数,string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string;
  5. (1)注意:这个类独立于所使用的编码来处理字节 :如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。不能操作多字节或者变长字符的序列。
    (2)在使用string类时,必须包含#include头文件以及using namespace std;(也可以单独展开命名空间域std:string)

2.string的常用接口介绍

(1)构造函数string类对象的常见构造

代码示例

cpp 复制代码
#include<iostream>
#include<string>
using namespace std;
int main()
{
	//1.默认构造
	string s1;
	//2.带参构造
	string s2("hello world");
	//3.拷贝构造
	string s3 = s2;
	//4.隐式类型转换
	string s4 = "hello world";
	//5.字符
	string s5(5,'x');
}

运行结果

!

(2) string类对象的容量操作

  • size使用示例

size和length的作用是一样的,只是为了适配其他容器,一般使用size

c 复制代码
//下标+[]
	for (int i = 0; i < s1.size(); i++)
	{
		cout << s1[i] << " ";
	}
	cout << endl;
  • empty使用注意

这个程序,会引发越界访问和无限循环,这是因为只要s1一开始不为空且在后续循环中不被修改为空,也没有越界检查,循环就会一直进行下去。

修改:(说明:遍历字符串并不需要这么麻烦,这是为了提醒使用empty越界的错误演示)

c 复制代码
void test03()
{
	string s1("hello world");
	for(int i=0;!s1.empty();i++)
	{
		if (i == s1.size())
		{
			break;
		}
		cout << s1[i] ;
	}
}
  • clear使用示例
    说明:将s1中的字符串清空,注意清空时只是将size清0,不改变底层空间的大小

reserve使用

说明:reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大

如果能提前确定所需空间大小,利用reserve提高插入数据的效率,避免增容带来的开销

resize使用示例

cpp 复制代码
void test03()
{
	string s("hi");
	// 将s中有效字符个数增加到10个,多出位置用'a'进行填充
	// "aaaaaaaaaa"
	s.resize(10, 'a');
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;

	// 将s中有效字符个数增加到15个,多出位置用缺省值'\0'进行填充
	// "aaaaaaaaaa\0\0\0\0\0"
	// 注意此时s中有效字符个数已经增加到15个
	s.resize(15);
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;

	// 将s中有效字符个数缩小到5个
	s.resize(5);
	cout << s.size() << endl;
	cout << s.capacity() << endl;
	cout << s << endl;

}

(3)string类对象的修改操作

相关推荐
奶香臭豆腐8 分钟前
C++ —— 模板类具体化
开发语言·c++·学习
不想当程序猿_14 分钟前
【蓝桥杯每日一题】分糖果——DFS
c++·算法·蓝桥杯·深度优先
cdut_suye25 分钟前
Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试
java·linux·运维·服务器·c++·人工智能·python
波音彬要多做1 小时前
41 stack类与queue类
开发语言·数据结构·c++·学习·算法
捕鲸叉1 小时前
C++软件设计模式之外观(Facade)模式
c++·设计模式·外观模式
只做开心事2 小时前
C++之红黑树模拟实现
开发语言·c++
程序员老冯头3 小时前
第十五章 C++ 数组
开发语言·c++·算法
程序猿会指北4 小时前
【鸿蒙(HarmonyOS)性能优化指南】启动分析工具Launch Profiler
c++·性能优化·harmonyos·openharmony·arkui·启动优化·鸿蒙开发
无 证明8 小时前
new 分配空间;引用
数据结构·c++
别NULL12 小时前
机试题——疯长的草
数据结构·c++·算法